Apache Spark JDBC數據源查詢選項不適用於Oracle數據庫

了解如何從Databricks解決使用Apache Spark JDBC數據源連接到Oracle數據庫時發生的錯誤。

寫的亞當Pavlacka

最後發布時間:2022年6月1日


問題

當您使用查詢選項與Apache Spark JDBC數據源連接到Oracle數據庫,它失敗了,出現以下錯誤:

java.sql.SQLSyntaxErrorException: ORA-00911:無效字符

例如,如果您運行以下命令建立JDBC連接:

%scala val df = spark。read .format("jdbc") .option("url", "") .option("query", "SELECT * FROM oracle_test_table)") .option("user", "") .option("password", "") .option("driver", "oracle.jdbc.driver.OracleDriver") .load() df.show()

你會看到這個錯誤信息:

java.sql.SQLSyntaxErrorException: ORA-00911: invalid character at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:447) at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:396) at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:951) at oracle.jdbc.driver. t4cttifo .receive(t4cttifo .java:513)

導致

錯誤是由於spark生成的子查詢別名(使用查詢選項)不符合Oracle數據庫標識符命名約定。此bug在Spark Jira ticket中被跟蹤火星- 27596

解決方案

在Apache Spark 2.4.4和Databricks Runtime 5.4版本中修複了此問題。

對於運行在Spark或Databricks Runtime較早版本上的集群,請使用數據表選項而不是查詢選擇。查詢必須作為子查詢括在圓括號中。

%scala val df = spark。read .format("jdbc") .option("url", "") .option("dbtable", "(SELECT * FROM oracle_test_table)") .option("user", "") .option("password", "") .option("driver", "oracle.jdbc.driver.OracleDriver") .load() df.show()

當查詢選項失敗時,可以對其他數據庫嚐試相同的解決方法。