HIVE 将覆盖插入到分区表中

Bag*_*thi 5 hadoop hive

我在分区表上运行了插入覆盖。在命令之后,例如创建以下分区。a,b,c,d,e

现在当我重新运行插入覆盖表时,但这次使用完全不同的数据集。比如说,在第二次插入之后,下面的分区被创建。f,g,h,i,j

问题 - 第二次插入的数据不会覆盖属于第一次插入的数据。第二次插入后,我仍然在 HDFS 中看到文件夹 a、b、c、d、e。但是当我通过 HIVE 查询它们时,分区 a,b,c,d,e 没有出现。

这是插入覆盖表的预期行为吗?或者我在这里遗漏了什么?

小智 11

以下是一些示例脚本及其效果。

假设我们有一个SOME_TABLE包含三个字段AB、 和C和两个分区字段YEAR、 和 的表MONTH。假设我们要删除表中的数据而不是表的结构。

1.无分区规格

如果我们跑

INSERT OVERWRITE TABLE SOME_TABLE
PARTITION
(
     YEAR
    ,MONTH
)
SELECT A,B,C,YEAR,MONTH
FROM SOME_TABLE
WHERE FALSE
Run Code Online (Sandbox Code Playgroud)

然后查询执行但数据留在那里。

2. 部分分区规格

如果我们跑

INSERT OVERWRITE TABLE SOME_TABLE
PARTITION
(
     YEAR=2018
    ,MONTH
)
SELECT A,B,C,MONTH
FROM SOME_TABLE
WHERE FALSE
Run Code Online (Sandbox Code Playgroud)

然后同样发生:数据留在那里。

3.全分区规格

如果我们跑

INSERT OVERWRITE TABLE SOME_TABLE
PARTITION
(
     YEAR=2018
    ,MONTH=11
)
SELECT A,B,C
FROM SOME_TABLE
WHERE FALSE
Run Code Online (Sandbox Code Playgroud)

只有到那时,数据才会被删除,并且只针对给定的年月。其他分区中的数据不会被删除。

请注意,没有删除任何分区,并且 aSHOW PARTITIONS SOME_TABLE返回所有分区,包括在运行INSERT OVERWRITE.

旁注: 我很想知道是否有办法删除所有现有数据,但保留表结构。DROP TABLE会放弃结构。ALTER TABLE ... DROP PARTITION只会删除目标分区,因此我们必须提前知道每个分区字段采用的值范围。在这个例子中,我们可以做

ALTER TABLE SOME_TABLE DROP PARTITION(year>=0,month>0) PURGE;
Run Code Online (Sandbox Code Playgroud)

但它似乎仍然是一个太复杂的解决方案。


Pus*_*kin 2

真奇怪。我尝试了上述场景,但看到了不同的结果。首先插入覆盖,创建了 a、b、c、d、e 分区。也能够通过 SHOW PARTITIONS 命令查看它们,并能够执行返回数据的选择查询。

然后我进行了另一次插入覆盖,创建了五个新分区 f、g、h、i、j。当我执行 SHOW PARTITIONS 时,我会看到从 a 到 j 的所有分区。此外,所有分区中的数据都是完整的,并且可以通过 select 语句获取它。

下一步,我尝试将数据加载到现有分区(例如 a)中,我可以看到数据覆盖了分区中的现有数据。这是预期的行为。

请分享您用于创建表并将数据加载到其中的语句。