[英]Overwrite only some partitions in a partitioned spark Dataset
我们如何覆盖分区数据集,但只覆盖我们要更改的分区? 比如重新计算上周的日常作业,只覆盖上周的数据。
默认的 Spark 行为是覆盖整个表,即使只有一些分区将被写入。
从 Spark 2.3.0 开始,这是覆盖表时的一个选项。 要覆盖它,您需要将新的spark.sql.sources.partitionOverwriteMode
设置设置为dynamic
,需要对数据集进行分区,并且写入模式overwrite
。 Scala 中的示例:
spark.conf.set(
"spark.sql.sources.partitionOverwriteMode", "dynamic"
)
data.write.mode("overwrite").insertInto("partitioned_table")
我建议在写入之前根据您的分区列进行重新分区,这样每个文件夹最终不会有 400 个文件。
在 Spark 2.3.0 之前,最好的解决方案是启动 SQL 语句删除这些分区,然后使用模式追加写入它们。
仅供参考,对于 PySpark 用户,请确保在insertInto
设置overwrite=True
否则模式将更改为append
从源代码:
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.