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编写它们.
仅供参考,对于PySpark用户,请确保设置overwrite=True为insertInto否则模式将更改为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)
| 归档时间: |
|
| 查看次数: |
5097 次 |
| 最近记录: |