我目前正在使用adwords API,并且必须处理1、7和30天的数据。 因此,spark作业是基本的,加载csv并将其写入具有分区的镶木地板中:
df.write
.mode("append")
.format("parquet")
.partitionBy("customer_id", "date")
.option("path", warehouse_location+"/"+table)
.saveAsTable(table)
现在,我面临的问题是7天和30天将在某个时间点(直到1天前)遍历已处理的数据,因此在我的分区table/customer_id/date/file.parquet
上,追加将追加第二个镶木文件到这个分区。
但是在这种情况下,我希望新的实木复合地板文件覆盖以前的实木复合地板文件(因为adwords csv可能会在生成的第一天和7/30天之后发生变化)。
我环顾四周,如果我尝试使用“覆盖”,它将覆盖整个表,而不仅仅是分区。
您对如何进行此处有任何建议吗?
我不是Spark专家,现在我唯一的选择是拥有一个脚本,该脚本将根据文件时间戳清除该位置。但这不适合这里的解决方案。
PS:我正在使用Spark 2.4
答案 0 :(得分:1)
基于SPARK-20236,应设置spark.sql.sources.partitionOverwriteMode="dynamic"
属性,然后使用"overwrite"
模式替换现有表中的各个分区。