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