繁体   English   中英

仅覆盖分区 spark 数据集中的某些分区

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM