我在分区表上运行了一个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表的预期行为吗?或者我在这里遗漏了什么?
答案 0 :(得分:2)
以下是一些示例脚本及其效果。
假设我们有一个表SOME_TABLE
,其中包含三个字段A
,B
和C
,以及两个分区字段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)
然后我做了另一个插入覆盖,创建了五个新的分区f,g,h,i,j。当我做SHOW PARTITIONS时,我看到所有分区从a到j。此外,所有分区中的数据都是完整的,并且能够通过select语句获取它。
作为下一步,我尝试将数据加载到现有分区中,并说我可以看到数据覆盖分区中的现有数据。 这是预期的行为。
请分享您用于创建表格的语句并将数据加载到其中。