Hive 配置单元删除已存在的分区

Hive 配置单元删除已存在的分区,hive,Hive,我正在使用配置单元将数据加载到不同的分区中 我正在创建一个表 CREATE TABLE X IF NOT EXISTS ... USING PARQUET PARTITIONED BY (Year, Month,Day) LOCATION '...' 之后,我将执行满载: INSERT OVERWRITE TABLE ... PARTITION (Year, Month, Day) SELECT ... FROM Y 显示分区正确地显示所有分区 满负荷后,我只想始终动态地重新加载当前年份:

我正在使用配置单元将数据加载到不同的分区中

我正在创建一个表

CREATE TABLE X IF NOT EXISTS ... USING PARQUET PARTITIONED BY (Year, Month,Day)
LOCATION '...'
之后,我将执行满载:

INSERT OVERWRITE TABLE ... PARTITION (Year, Month, Day)
SELECT ... FROM Y
显示分区正确地显示所有分区

满负荷后,我只想始终动态地重新加载当前年份:

INSERT OVERWRITE TABLE ... PARTITION (Year, Month, Day)
SELECT ... FROM Y WHERE Year = YEAR(CURRENT_DATE())
我遇到的问题是,HIVE删除了所有以前的分区,即2017、2018和2019。我以为HIVE只覆盖2019年的分区,而不是全部


我想我做错了什么-欢迎任何想法。

尝试使用“插入到表中”而不是“插入覆盖表”。它应该能解决你的问题。:)

好吧,我仔细研究了官方的databricks指南之后,就得到了解决方案

答案如下:

根据目标表的类型,语义是不同的

配置单元SerDe表:INSERT OVERRIDE不会提前删除分区,只会覆盖那些在运行时将数据写入其中的分区。这与Apache配置单元语义相匹配。对于配置单元SerDe表,Spark SQL尊重配置单元相关的配置,包括Hive.exec.dynamic.partition和Hive.exec.dynamic.partition.mode。
本机数据源表:插入覆盖首先删除与分区规范匹配的所有分区(例如,分区(a=1,b)),然后插入所有剩余值。自Databricks Runtime 3.2以来,可以通过将特定于会话的配置spark.sql.sources.partitionOverwriteMode更改为DYNAMIC,将本机数据源表的行为更改为与配置单元SerDe表一致。默认模式为静态。

不幸的是,这会导致双条目。表X是外部表还是内部表?