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
下的数据。怎么办呢?
答案 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"
设置。