[英]Spark Dataframe from SQL Query
我正在嘗試使用Apache Spark來將具有多個聯接和子選擇的(大型)SQL查詢的結果加載到Spark的DataFrame中,如從SQL Query中創建Spark數據幀中所述 。
不幸的是,我這樣做的嘗試導致Parquet錯誤:
線程“主”中的異常org.apache.spark.sql.AnalysisException:無法推斷Parquet的架構。 必須手動指定。
我已經從Google看到了一些信息,這暗示着當DataFrame為空時會發生此錯誤。 但是,查詢結果在DBeaver中加載了大量行。
這是查詢示例:
(SELECT REPORT_DATE, JOB_CODE, DEPT_NBR, QTY
FROM DBO.TEMP
WHERE BUSINESS_DATE = '2019-06-18'
AND STORE_NBR IN (999)
ORDER BY BUSINESS_DATE) as reports
我的Spark代碼如下所示。
val reportsDataFrame = spark
.read
.option("url", db2JdbcUrl)
.option("dbtable", queries.reports)
.load()
scheduledHoursDf.show(10)
我在上一個答案中讀到,可以使用此方法對整個數據庫運行查詢。 特別是,當您首次在Spark中構建DataFrame時,如果將“ dbtable”參數指定為別名查詢 。 您可以通過將整個查詢指定為別名作為“報告”來看到我已經在查詢中完成了此操作。
我不認為這是重復的問題。 我已經廣泛研究了此特定問題,但沒有找到任何在線面臨相同問題的人。 特別是,運行查詢會導致Parquet錯誤。
似乎已經達成共識,即不應以這種方式運行SQL查詢,而應使用Spark的DataFrames的許多方法來過濾,分組和聚合數據。 但是,即使使用原始SQL會導致性能下降,這對我們來說也非常有價值。
快速查看您的代碼告訴我您缺少.format("jdbc")
val reportsDataFrame = spark
.read
.format("jdbc")
.option("url", db2JdbcUrl)
.option("dbtable", queries.reports)
.load()
只要您設置了用於連接數據庫的用戶名和密碼,這應該可以工作。
一個很好的資源,可以在Spark中進一步了解JDBC源( https://spark.apache.org/docs/latest/sql-data-sources-jdbc.html )
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.