使用已知架构保存空 DataFrame (Spark 2.2.1)

Eri*_*rik 5 apache-spark parquet databricks

是否可以使用已知模式保存一个空的 DataFrame,以便将模式写入文件,即使它有 0 条记录?

def example(spark: SparkSession, path: String, schema: StructType) = { 
  val dataframe = spark.createDataFrame(spark.sparkContext.emptyRDD[Row], schema) 
  val dataframeWriter = dataframe.write.mode(SaveMode.Overwrite).format("parquet") 
  dataframeWriter.save(path) 

  spark.read.load(path) // ERROR!! No files to read, so schema unknown 
} 
Run Code Online (Sandbox Code Playgroud)

Eri*_*rik 6

这是我从 Databricks 支持收到的答案:

这实际上是 Spark 中的一个已知问题。已经在开源 JIRA -> https://issues.apache.org/jira/browse/SPARK-23271 中完成了修复。有关此行为如何从 2.4 更改的更多详细信息,请查看此文档更改 https://github.com/apache/spark/pull/20525/files#diff-d8aa7a37d17a​​1227cba38c99f9f22511R1808 该行为将从 Spark 2.4 更改。在此之前,您需要采用以下任何一种方式

  1. 使用至少一条记录保存数据帧以保留其架构
  2. 将架构保存在 JSON 文件中并稍后使用


小智 5

我在 Spark 2.1.0 中遇到了类似的问题。我在写之前使用重新分区解决了它。

df.repartition(1).write.parquet("my/path")
Run Code Online (Sandbox Code Playgroud)