問題
嚐試通過JDBC讀取外部表在Databricks Runtime 5.5上可以正常工作,但是在Databricks Runtime 6.0及以上版本上讀取相同的表會失敗。
你會看到類似如下的錯誤:
com.databricks.backend.common.rpc.DatabricksExceptions$SQLExecutionException: java.util.concurrent.ExecutionException: org.apache.spark.sql.AnalysisException: org.apache.spark.sql.jdbc不允許用戶指定的模式。at com.google.common.util.concurrent.AbstractFuture$Sync.getValue(AbstractFuture.java:299) at com.google.common.util.concurrent.AbstractFuture.get(AbstractFuture.java: 286) at com.google.common.util.concurrent.AbstractFuture.get(AbstractFuture.java:116) at java.lang.Thread.run(Thread.java:748)原因:org.apache.spark.sql.AnalysisException: org.apache.spark.sql.jdbc不允許用戶指定的模式;org.apache.spark.sql.execution.datasources.DataSource.resolveRelation (DataSource.scala: 350)
導致
Databricks運行時5.5及以下版本推斷session_id屬性作為短整型.Databricks Runtime 6.0及以上版本session_id屬性作為int.
這是對session_id屬性導致查詢因模式問題而失敗。
解決方案
如果您正在使用在Databricks Runtime 5.5及以下版本(Databricks Runtime 6.0及以上版本)中創建的外部表,必須設置Apache Spark配置spark.sql.legacy.mssqlserver.numericMapping.enabled來真正的.這確保Databricks Runtime 6.0及以上版本可以推斷session_id屬性作為短整型.
- 打開集群頁麵。
- 選擇集群。
- 點擊編輯.
- 點擊高級選項.
- 點擊火花.
- 在火花配置字段中,輸入spark.sql.legacy.mssqlserver.numericMapping.enabled真實.
- 保存更改並啟動或重新啟動集群。