2017-06-15 407 views
1

我们使用下面的方法来保存从docs火花SQL数据帧Spark:如何防止DataFrameWriter在调用write.partitionBy时删除分区列?

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

分区由文件系统在给定的列中的输出。如果指定了 ,则输出将在类似于Hive的 分区方案的文件系统上进行布局。举个例子,当我们通过 一年,然后一个月分区的数据集,目录布局会是什么样子:
- 年= 2016 /月= 01/
- 年= 2016 /月= 02/

我们的代码看起来是这样的:

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

我们得到我们期望的目录布局,但我们发现拼花文件没有在他们day列了。我们希望镶木地板文件有一天的专栏。我们应该怎么做?

回答

0

最好的解决方案是向数据框中添加一个重复的日期列,该日期列将被放置在实木复合地板文件中,但原始的day列仍然存在。

0

一般来说,Morpheus的回答是一个很好的答案。但...

如果您严格阅读和书写火花,您可以在读取数据时使用basePath选项。

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

通过传递路径/到/表要么SparkSession.read.parquet或SparkSession.read.load,火花SQL将自动提取的路径中的划分信息。

实施例:

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