Hive删除现有分区

时间:2019-01-23 09:02:22

标签: 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

显示分区会正确显示所有分区。

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

INSERT OVERWRITE TABLE ... PARTITION (Year, Month, Day)
SELECT ... FROM Y WHERE Year = YEAR(CURRENT_DATE())
  

我遇到的问题是,HIVE会删除所有以前的分区,即2017、2018和2019年仍然存在。我以为HIVE仅覆盖2019年的分区,但不是全部。

我想我做错了-欢迎提出任何想法。

2 个答案:

答案 0 :(得分:0)

尝试使用“插入表”而不是“插入覆盖表”。它应该可以解决您的问题。 :)

答案 1 :(得分:0)

好的,当我更仔细地研究了官方数据砖指南后,我便获得了解决方案。

这是答案:

语义因目标表的类型而异。

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