来自 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 源的好资源
我正在尝试使用 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 源的好资源