我们如何覆盖分区数据集,但只覆盖我们要更改的分区?例如,重新计算上周的日常工作,只覆盖上周的数据。
默认的Spark行为是覆盖整个表,即使只写一些分区。
答案 0 :(得分:29)
从Spark 2.3.0开始,这是覆盖表时的一个选项。要覆盖它,您需要将新的spark.sql.sources.partitionOverwriteMode
设置设置为dynamic
,需要对数据集进行分区,并将写入模式设置为overwrite
。
例如:
spark.conf.set(
"spark.sql.sources.partitionOverwriteMode", "dynamic"
)
data.write.mode("overwrite").insertInto("partitioned_table")
我建议您在写入之前根据分区列进行重新分区,这样每个文件夹最终不会有400个文件。
在Spark 2.3.0之前,最好的解决方案是启动SQL语句来删除这些分区,然后使用mode append编写它们。
答案 1 :(得分:8)
仅供参考,对于PySpark用户,请务必在overwrite=True
中设置insertInto
,否则模式将更改为append
来自source code:
def insertInto(self, tableName, overwrite=False):
self._jwrite.mode(
"overwrite" if overwrite else "append"
).insertInto(tableName)
这个如何使用它:
spark.conf.set("spark.sql.sources.partitionOverwriteMode","DYNAMIC")
data.write.insertInto("partitioned_table", overwrite=True)
或在SQL版本中工作正常。
INSERT OVERWRITE TABLE [db_name.]table_name [PARTITION part_spec] select_statement