spark动态分区参数spark.sql.sources.partitionOverwriteMode
Attention:这个搞不好整个表数据就干没了
spark.sql.sources.partitionOverwriteMode
动态分区的参数
static 就是 覆盖整个表(无论动态分区是否匹配),会删除表中所有现有分区,仅保留本次写入的分区。
dynamic 就是 仅覆盖本次写入中包含的分区,未被写入的现有分区会保留
--------------------------------------------------------------------------------------------------------------------------
使用sparksql insert overwrite插入hive分区导致所有分区被删
简单记录一下,防止踩坑。
hive.exec.dynamic.partition=true
hive.exec.dynamic.partition.mode=nonstrict
开启这两个参数,进行动态插入分区表:
insert overwrite table tablename partition(part_col)
1.这种方式在2.3之前,只会修改查询结果的分区,没什么问题。
2.但是如果在2.3之后,spark会增加一个spark.sql.sources.partitionOverwriteMode参数,这个参数有两个值,默认static,可修改为dynamic。问题就出在这里,如果不更改这个参数,使用默认的static,在动态插入时,不管插入的分区是否存在,都会导致所有的分区被覆盖,数据无法找回。
3.可以在hive中使用show create table查看spark.sql.create.version来确认表的版本。
