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

oxcyiej7  于 2021-06-26  发布在  Hive
关注(0)|答案(2)|浏览(543)

我们如何覆盖一个分区的数据集,而只覆盖我们要更改的分区?例如,重新计算上周的每日作业,并仅覆盖上周的数据。
默认的spark行为是覆盖整个表,即使只写一些分区。

k2fxgqgv

k2fxgqgv1#

仅供参考,对于pyspark用户,请确保设置 overwrite=TrueinsertInto 否则模式将更改为 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

医生看这里

jv2fixgn

jv2fixgn2#

由于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语句删除这些分区,然后使用模式append编写它们。

相关问题