我们如何覆盖一个分区的数据集,而只覆盖我们要更改的分区?例如,重新计算上周的每日作业,并仅覆盖上周的数据。默认的spark行为是覆盖整个表,即使只写一些分区。
k2fxgqgv1#
仅供参考,对于pyspark用户,请确保设置 overwrite=True 在 insertInto 否则模式将更改为 append 从源代码:
overwrite=True
insertInto
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
医生看这里
jv2fixgn2#
由于spark 2.3.0,这是重写表时的一个选项。要覆盖它,需要设置新的 spark.sql.sources.partitionOverwriteMode 设置为 dynamic ,数据集需要分区,写入模式 overwrite . scala中的示例:
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语句删除这些分区,然后使用模式append编写它们。
2条答案
按热度按时间k2fxgqgv1#
仅供参考,对于pyspark用户,请确保设置
overwrite=True
在insertInto
否则模式将更改为append
从源代码:如何使用它:
或者在sql版本中运行良好。
医生看这里
jv2fixgn2#
由于spark 2.3.0,这是重写表时的一个选项。要覆盖它,需要设置新的
spark.sql.sources.partitionOverwriteMode
设置为dynamic
,数据集需要分区,写入模式overwrite
. scala中的示例:我建议在编写之前根据分区列重新分区,这样每个文件夹就不会有400个文件。
在spark 2.3.0之前,最好的解决方案是启动sql语句删除这些分区,然后使用模式append编写它们。