HIVE将覆盖插入分区表

时间:2016-10-19 23:43:01

标签: hadoop hive

我在分区表上运行了一个insert overwrite。在命令之后,例如,创建以下分区。         A,B,C,d,E

现在,当我重新运行Insert overwrite表时,这次使用完全不同的数据集。比如说,在第二次插入之后,创建了下面的分区。           F,G,H,I,J

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

这是Insert overwrite表的预期行为吗?或者我在这里遗漏了什么?

3 个答案:

答案 0 :(得分:2)

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

假设我们有一个表SOME_TABLE,其中包含三个字段ABC,以及两个分区字段YEAR和{ {1}}。 假设我们要删除表中的数据,而不是表的结构。

1。没有分区规范

如果我们跑步

MONTH

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

2。部分分区规范

如果我们跑步

INSERT OVERWRITE TABLE SOME_TABLE
PARTITION
(
     YEAR
    ,MONTH
)
SELECT A,B,C,YEAR,MONTH
FROM SOME_TABLE
WHERE FALSE

然后发生同样的情况:数据保留在那里。

3。完整分区规范

如果我们跑步

INSERT OVERWRITE TABLE SOME_TABLE
PARTITION
(
     YEAR=2018
    ,MONTH
)
SELECT A,B,C,MONTH
FROM SOME_TABLE
WHERE FALSE

只有这样,才会擦除数据,并且仅擦除给定的年份和月份。其他分区中的数据不会被删除。

请注意,没有删除分区,并且INSERT OVERWRITE TABLE SOME_TABLE PARTITION ( YEAR=2018 ,MONTH=11 ) SELECT A,B,C FROM SOME_TABLE WHERE FALSE 返回所有分区,包括运行SHOW PARTITIONS SOME_TABLE之前存在的分区。

旁注: 我很想知道是否有一种方法可以删除所有现有数据,但要保留表结构。 INSERT OVERWRITE将删除该结构。 DROP TABLE只会删除目标分区,因此我们必须事先知道每个分区字段采用的值范围。在这个例子中,我们可以做

ALTER TABLE ... DROP PARTITION

但是它似乎仍然太复杂了。

答案 1 :(得分:1)

在hive中插入覆盖会删除所有现有数据,而不是使用之前创建的分区(创建表时)写入新数据。当你创建分区时,它们被添加到hive元数据,但它们会一直存在,直到你删除分区或表。因此,当你“覆盖”一个表时,这些分区仍然适用于新数据。

答案 2 :(得分:0)

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

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

作为下一步,我尝试将数据加载到现有分区中,并说我可以看到数据覆盖分区中的现有数据。 这是预期的行为。

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