我正在尝试使用以下代码覆盖单个分区,但不是在覆盖/替换现有分区,而是在其中创建子文件夹。
请告知我如何使它工作。下面的代码将文件夹创建为/data/input/STATS/my_date=2018-01-03/my_date=2018-01-03/
但是我希望它替换现有的文件夹/data/input/STATS/my_date=2018-01-03/my_date=2018-01-03/
我正在尝试使用以下代码覆盖单个分区,但不是在覆盖/替换现有分区,而是在其中创建子文件夹。
请告知我如何使它工作。下面的代码将文件夹创建为
/data/input/STATS/my_date=2018-01-03/my_date=2018-01-03/
df.write.mode("Overwrite").partitionBy("my_date").parquet("/data/input/STATS/my_date=2018-01-03/")
以上代码将文件夹创建为/data/input/STATS/my_date=2018-01-03/my_date=2018-01-03/
我想在Spark 1.6.2上使用它
答案 0 :(得分:0)
实际上,以上代码在以下路径下创建/替换任何文件夹(分区)
/data/input/STATS/my_date=2018-01-03/
因此,如果更改数据,它将插入新的子文件夹
/data/input/STATS/my_date=2018-01-03/my_date=2018-01-02
/data/input/STATS/my_date=2018-01-03/my_date=2018-01-03
如果您需要替换新分区,这是一个常见问题,可以使用下面的行来解决
df.write.mode(SaveMode.Overwrite).save("/root/path/to/data/partition_col=value")
然后您可以编写一些代码以从代码中获取不同的分区,然后使用df.foreachPartition{partition=> some code }
并将该分区传递给save命令
更新:我们可以选择不同的分区并过滤数据框,然后单独编写每个框
val uniquePartitionNames = df.select($"colname").distinct().collect()
for (partition <- uniquePartitionNames ) {
val filteredDFBaseOnPartition = df.where($"colname" === partition)
filteredDFBaseOnPartition .write.mode("Overwrite").save("path/colname="+partition)
}