Spark:如何在保存到磁盘时覆盖分区中的数据而不覆盖根文件夹中的数据?

时间:2017-04-19 23:46:52

标签: apache-spark

W.r.t。以下代码:

spark.sql(sqlStatement).write.partitionBy("city", "dataset", "origin").mode(SaveMode.Overwrite).parquet(rootPath)

在向其写入数据之前删除rootPath下的所有内容。如果代码更改为:

spark.sql(sqlStatement).write.partitionBy("city", "dataset", "origin").mode(SaveMode.Append).parquet(rootPath)

然后它不删除任何东西。我们想要的是一种模式,它不会删除rootPath下的数据,但会在写入之前删除city/dataset/origin下的数据。怎么办呢?

2 个答案:

答案 0 :(得分:1)

尝试basepath选项。分区发现仅针对'/ city / dataset / origin'

的子项

根据文件 -

  

Spark SQL的分区发现已更改为仅发现作为给定路径的子级的分区目录。 (即如果   path =“/ my / data / x = 1”然后x = 1将不再被视为分区   但只有x = 1的子项。)可以手动覆盖此行为   指定分区发现应该从哪个开始的basePath   (火花11678)。

spark.sql(sqlStatement)\
.write.partitionBy("city", "dataset","origin")\
.option("basePath","/city/dataset/origin") \
.mode(SaveMode.Append).parquet(rootPath)

如果这不起作用,请告诉我。我会删除我的答案。

答案 1 :(得分:0)

看看Spark 2.3.0中引入的spark.sql.sources.partitionOverwriteMode="dynamic"设置。