使用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来确认表的版本。