Spark:如何阻止DataFrameWriter在调用write.partitionBy时删除分区列?

时间:2017-06-15 19:54:20

标签: spark-dataframe

我们使用下面的方法来保存spark sql数据帧

public DataFrameWriter<T> partitionBy(scala.collection.Seq<String> colNames)

来自docs

  

通过文件系统上的给定列对输出进行分区。如果   如果指定,输出将布置在类似于Hive的文件系统上   分区方案。例如,当我们对数据集进行分区时   一年又一个月,目录布局如下:
   - 年= 2016 /月= 01 /
   - 年= 2016 /月= 02 /

我们的代码如下所示:

df.repartition(new Column("day")).write.partitionBy("day").mode(SaveMode.Overwrite).parquet(outputPath)

我们得到了我们期望的目录布局,但我们发现镶木地板文件中不再包含day列。我们希望镶木地板文件有日列。我们应该怎么做?

2 个答案:

答案 0 :(得分:1)

总的来说,Morpheus的回答是一个很好的问题。但是...

如果你严格阅读和写入spark,你可以在阅读数据时使用basePath选项。

https://spark.apache.org/docs/2.2.0/sql-programming-guide.html#partition-discovery

  

通过将path / to / table传递给SparkSession.read.parquet或SparkSession.read.load,Spark SQL将自动从路径中提取分区信息。

示例:

     val dataset = spark
      .read
      .format("parquet")
      .option("basePath", hdfsInputBasePath)
      .load(hdfsInputPath)

答案 1 :(得分:0)

最好的解决方案是在数据框中添加一个重复的日期列,这些列会在镶木地板文件中删除,但原始的day列仍然存在。