【问题标题】:Spark Dataframe from SQL Query来自 SQL 查询的 Spark 数据框
【发布时间】:2019-11-19 07:12:41
【问题描述】:

我正在尝试使用 Apache Spark 将具有多个连接和子选择的(大型)SQL 查询的结果从 Spark 加载到 DataFrame 中,如Create Spark Dataframe from SQL Query 中所述。

不幸的是,我这样做的尝试导致 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 代替对我们来说非常有价值,即使它会导致性能损失。

【问题讨论】:

    标签: sql scala apache-spark db2 parquet


    【解决方案1】:

    快速查看您的代码告诉我您缺少.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)

    【讨论】:

      猜你喜欢
      • 2016-05-15
      • 1970-01-01
      • 2016-11-17
      • 2020-11-01
      • 2015-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多