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