簡體   English   中英

SQL查詢中的Spark Dataframe

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM