Spark认为我正在从Parquet文件中读取DataFrame

时间:2018-05-18 14:08:25

标签: apache-spark parquet

Spark 2.x在这里。我的代码:

val query = "SELECT * FROM some_big_table WHERE something > 1"

val df : DataFrame = spark.read
  .option("url",
    s"""jdbc:postgresql://${redshiftInfo.hostnameAndPort}/${redshiftInfo.database}?currentSchema=${redshiftInfo.schema}"""
  )
  .option("user", redshiftInfo.username)
  .option("password", redshiftInfo.password)
  .option("dbtable", query)
  .load()

产地:

Exception in thread "main" org.apache.spark.sql.AnalysisException: Unable to infer schema for Parquet. It must be specified manually.;
    at org.apache.spark.sql.execution.datasources.DataSource$$anonfun$8.apply(DataSource.scala:183)
    at org.apache.spark.sql.execution.datasources.DataSource$$anonfun$8.apply(DataSource.scala:183)
    at scala.Option.getOrElse(Option.scala:121)

我没有从Parquet文件中读取任何,我正在阅读Redshift(RDBMS)表。那我为什么会收到这个错误?

1 个答案:

答案 0 :(得分:4)

如果您使用通用load功能,您还应该包含格式:

// Query has to be subquery 
val query = "(SELECT * FROM some_big_table WHERE something > 1) as tmp"

...
  .format("jdbc")
  .option("dbtable", query)
  .load()

否则Spark假定您使用默认格式,在没有特定配置的情况下,是Parquet。

也没有任何因素强迫您使用dbtable

spark.read.jdbc(
  s"jdbc:postgresql://${hostnameAndPort}/${database}?currentSchema=${schema}",
  query, 
  props 
)

变体也有效。

当然,只需要这么简单的查询,就不需要它了:

spark.read.jdbc(
  s"jdbc:postgresql://${hostnameAndPort}/${database}?currentSchema=${schema}",
  some_big_table, 
  props 
).where("something > 1")

将以相同的方式工作,如果您想提高性能,则应考虑并行查询

甚至更好,请尝试Redshift connector