以下是一些示例脚本及其效果。
假设我们有一个表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
只有这样,数据才会被删除,并且仅限于给定的年份和月份。其他分区的数据不会被删除。
请注意,没有删除任何分区,SHOW PARTITIONS SOME_TABLE 返回所有分区,包括在运行INSERT OVERWRITE 之前存在的分区。
旁注:
我很想知道是否有办法删除所有现有数据,但保留表结构。 DROP TABLE 将删除该结构。 ALTER TABLE ... DROP PARTITION 只会删除目标分区,因此我们必须提前知道每个分区字段的取值范围。在这个例子中,我们可以这样做
ALTER TABLE SOME_TABLE DROP PARTITION(year>=0,month>0) PURGE;
但它似乎仍然太复杂的解决方案。