Problemas ao ler as tabelas externas do JDBC após a atualização a partir do Databricks Runtime 5.5

Problema

Tentar ler tabelas externas via JDBC funciona bem em Databricks Runtime 5.5, mas a mesma tabela lê falha no Databricks Runtime 6.0 ou superior.

Vê-se um erro semelhante ao seguinte:

com.databricks.backend.common.rpc.DatabricksExceptions$SQLExecutionException: java.util.concurrent.ExecutionException: org.apache.spark.sql.AnalysisException: org.apache.spark.sql.jdbc does not allow user-specified schemas.
at com.google.common.util.concurrent.AbstractFuture$Sync.getValue(AbstractFuture.java:299)
at com.google.common.util.concurrent.AbstractFuture$Sync.get(AbstractFuture.java:286)
at com.google.common.util.concurrent.AbstractFuture.get(AbstractFuture.java:116)
at java.lang.Thread.run(Thread.java:748)
.
Caused by: org.apache.spark.sql.AnalysisException: org.apache.spark.sql.jdbc does not allow user-specified schemas.;

at org.apache.spark.sql.execution.datasources.DataSource.resolveRelation(DataSource.scala:350)

Causa

Databricks Runtime 5.5 e abaixo infere o session_id atributo como um smallint . Databricks Runtime 6.0 e acima infere o session_id atributo como um int .

Esta alteração ao session_id atributo faz com que as consultas falhem com um problema de esquema.

Solução

Se estiver a utilizar tabelas externas criadas no Databricks Runtime 5.5 e abaixo em Databricks Runtime 6.0 e superior, deve definir a configuração Apache Spark spark.sql.legacy.mssqlserver.numericMapping.enabled para true . Isto garante que databricks Runtime 6.0 e acima infere o session_id atributo como um smallint .

  1. Abra a página Clusters.
  2. Selecione um cluster.
  3. Clique em Editar.
  4. Clique em Opções Avançadas.
  5. Clique em Faísca.
  6. No campo Spark Config, spark.sql.legacy.mssqlserver.numericMapping.enabled true entre.
  7. Guarde a mudança e inicie, ou reinicie, o cluster.