如何在写入分区时避免创建重复的子文件夹

时间:2019-01-03 05:48:58

标签: scala apache-spark

我正在尝试使用以下代码覆盖单个分区,但不是在覆盖/替换现有分区,而是在其中创建子文件夹。

请告知我如何使它工作。下面的代码将文件夹创建为/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上使用它

1 个答案:

答案 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)
  }