我在分区表上运行了插入覆盖。在命令之后,例如创建以下分区。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包含三个字段A、B、 和C和两个分区字段YEAR、 和 的表MONTH。假设我们要删除表中的数据而不是表的结构。
1.无分区规格
如果我们跑
INSERT OVERWRITE TABLE SOME_TABLE
PARTITION
(
     YEAR
    ,MONTH
)
SELECT A,B,C,YEAR,MONTH
FROM SOME_TABLE
WHERE FALSE
然后查询执行但数据留在那里。
2. 部分分区规格
如果我们跑
INSERT OVERWRITE TABLE SOME_TABLE
PARTITION
(
     YEAR=2018
    ,MONTH
)
SELECT A,B,C,MONTH
FROM SOME_TABLE
WHERE FALSE
然后同样发生:数据留在那里。
3.全分区规格
如果我们跑
INSERT OVERWRITE TABLE SOME_TABLE
PARTITION
(
     YEAR=2018
    ,MONTH=11
)
SELECT A,B,C
FROM SOME_TABLE
WHERE FALSE
只有到那时,数据才会被删除,并且只针对给定的年月。其他分区中的数据不会被删除。
请注意,没有删除任何分区,并且 aSHOW PARTITIONS SOME_TABLE返回所有分区,包括在运行INSERT OVERWRITE.
旁注:
我很想知道是否有办法删除所有现有数据,但保留表结构。DROP TABLE会放弃结构。ALTER TABLE ... DROP PARTITION只会删除目标分区,因此我们必须提前知道每个分区字段采用的值范围。在这个例子中,我们可以做
ALTER TABLE SOME_TABLE DROP PARTITION(year>=0,month>0) PURGE;
但它似乎仍然是一个太复杂的解决方案。
真奇怪。我尝试了上述场景,但看到了不同的结果。首先插入覆盖,创建了 a、b、c、d、e 分区。也能够通过 SHOW PARTITIONS 命令查看它们,并能够执行返回数据的选择查询。
然后我进行了另一次插入覆盖,创建了五个新分区 f、g、h、i、j。当我执行 SHOW PARTITIONS 时,我会看到从 a 到 j 的所有分区。此外,所有分区中的数据都是完整的,并且可以通过 select 语句获取它。
下一步,我尝试将数据加载到现有分区(例如 a)中,我可以看到数据覆盖了分区中的现有数据。这是预期的行为。
请分享您用于创建表并将数据加载到其中的语句。
| 归档时间: | 
 | 
| 查看次数: | 36137 次 | 
| 最近记录: |