Dataframe 写入带有覆盖的空spark数据帧将删除所有现有分区

Dataframe 写入带有覆盖的空spark数据帧将删除所有现有分区,dataframe,apache-spark,hadoop,amazon-s3,pyspark,Dataframe,Apache Spark,Hadoop,Amazon S3,Pyspark,Spark在使用overwrite写入空数据帧时删除所有现有分区 我在下面有一段代码,用于将数据写入每天运行的s3 当存在新分区值时,这会动态添加新分区,但当数据帧为空时,它会删除所有分区 我必须在这里使用“覆盖”以避免重复数据。(附加不是选项) 我可以在写入之前检查数据帧是否为空,但这会增加开销 我觉得这种行为很奇怪,因为覆盖应该只覆盖匹配的分区 处理这种情况的正确方法是什么 注: 这个问题与下面的问题不同,因为我的问题特定于空数据帧和写入S3(而不是任何表),并且下面问题的解决方案不起作用,

Spark在使用overwrite写入空数据帧时删除所有现有分区

我在下面有一段代码,用于将数据写入每天运行的s3

当存在新分区值时,这会动态添加新分区,但当数据帧为空时,它会删除所有分区

我必须在这里使用“覆盖”以避免重复数据。(附加不是选项)

我可以在写入之前检查数据帧是否为空,但这会增加开销

我觉得这种行为很奇怪,因为覆盖应该只覆盖匹配的分区

处理这种情况的正确方法是什么

注: 这个问题与下面的问题不同,因为我的问题特定于空数据帧和写入S3(而不是任何表),并且下面问题的解决方案不起作用,因为属性“spark.sql.sources.partitionOverwriteMode”已设置为“dynamic”


@mazaneicha此问题不是重复问题,并在问题中添加了解释。当没有分区(空DF)时,它会写入根级别(表1)。此时,它将覆盖更下方的其余对象。最好的解决方案是使用一个简单的if语句
if(df.count!=0){df.write.partitionBy(“year”、“month”、“day”).mode(“overwrite”).parquet(“s3://…/table1/”)}
作为解决方法,我正在检查数据帧是否为空,但这似乎不是正确的方法。如果(测向头(1).size==0)
df.write
      .partitionBy("year", "month", "day")
      .mode("overwrite")
      .parquet("s3://..../table1/")