我们使用下面的方法来保存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
列。我们希望镶木地板文件有日列。我们应该怎么做?
答案 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
列仍然存在。