来自 SQL 查询的 Spark Dataframe

Spark Dataframe from SQL Query

我正在尝试使用 Apache Spark,以便将具有多个连接和子选择的(大)SQL 查询的结果加载到来自 Spark 的 DataFrame 中,如 中所述.

不幸的是,我这样做的尝试导致了 Parquet 的错误:

Exception in thread "main" org.apache.spark.sql.AnalysisException: Unable to infer schema for Parquet. It must be specified manually.

我从 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" 参数指定为 别名查询 。您可以看到我已经在查询中完成了此操作,方法是将整个查询指定为别名 "as reports"。

我不认为这是一个重复的问题。我已经广泛研究了这个具体问题,但没有发现任何人在网上面临同样的问题。特别是 运行 查询导致的 Parquet 错误。

似乎达成的共识是不应该 运行ning SQL 以这种方式查询,而应该使用 Spark 的 DataFrames 的许多方法来过滤、分组和聚合数据。但是,即使会导致性能下降,但能够使用 raw SQL 对我们来说非常有价值。

快速查看您的代码,我发现您遗漏了 .format("jdbc")

val reportsDataFrame = spark
  .read
  .format("jdbc")
  .option("url", db2JdbcUrl)
  .option("dbtable", queries.reports)
  .load()

如果您设置了连接到数据库的用户名和密码,这应该可以工作。

了解更多关于 spark (https://spark.apache.org/docs/latest/sql-data-sources-jdbc.html)JDBC 源的好资源