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

时间:2018-04-24 16:20:35

标签: apache-spark hive apache-spark-dataset

我们如何覆盖分区数据集,但只覆盖我们要更改的分区?例如,重新计算上周的日常工作,只覆盖上周的数据。

默认的Spark行为是覆盖整个表,即使只写一些分区。

2 个答案:

答案 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

for doc look at here