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

Mad*_*llo 15 hive apache-spark apache-spark-dataset

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

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

Mad*_*llo 38

从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")
Run Code Online (Sandbox Code Playgroud)

我建议您在写入之前根据分区列进行重新分区,这样每个文件夹最终不会有400个文件.

在Spark 2.3.0之前,最好的解决方案是启动SQL语句来删除这些分区,然后使用mode append编写它们.

  • 嗨,我试过这个,但对我不起作用。我不得不在 insertInto 方法 https://spark.apache.org/docs/2.3.0/api/python/pyspark.sql.html#pyspark.sql.DataFrameWriter.insertInto 中作为参数传递 overwrite=True 但是谢谢你的线索,这很摇滚 (2认同)

Ali*_*Bey 8

仅供参考,对于PySpark用户,请确保设置overwrite=TrueinsertInto否则模式将更改为append

来自源代码:

def insertInto(self, tableName, overwrite=False):
    self._jwrite.mode(
        "overwrite" if overwrite else "append"
    ).insertInto(tableName)
Run Code Online (Sandbox Code Playgroud)

这个如何使用它:

spark.conf.set("spark.sql.sources.partitionOverwriteMode","DYNAMIC")
data.write.insertInto("partitioned_table", overwrite=True)
Run Code Online (Sandbox Code Playgroud)

或者在SQL版本中工作正常.

INSERT OVERWRITE TABLE [db_name.]table_name [PARTITION part_spec] select_statement
Run Code Online (Sandbox Code Playgroud)

对于doc,请看这里