在运行时根据特定条件删除hive分区

时间:2016-11-06 20:52:36

标签: shell hive

我在使用以下命令构建的hive中有一个表:

create table t1 (x int, y int, s string) partitioned by (wk int) stored as sequencefile;

该表格包含以下数据:

select * from t1;
+-------+-------+-------+--------+--+
| t1.x  | t1.y  | t1.s  | t1.wk  |
+-------+-------+-------+--------+--+
| 1     | 2     | abc   | 10     |
| 4     | 5     | xyz   | 11     |
| 7     | 8     | pqr   | 12     |
+-------+-------+-------+--------+--+

现在问题是当分区计数为>=2时删除最旧的分区 可以在hql中处理,也可以通过任何shell脚本处理,以及如何处理?

考虑到我将使用dbname作为变量,如hive -e 'use "$dbname"; show partitions t1

1 个答案:

答案 0 :(得分:0)

如果您的分区按日期排序,您可以编写一个shell脚本,您可以使用hive -e 'SHOW PARTITIONS t1'来获取所有分区,在您的示例中,它将返回:

wk=10
wk=11
wk=12

然后您可以发出hive -e 'ALTER TABLE t1 DROP PARTITION (wk=10)'以删除第一个分区;

类似于:

db=mydb
if (( `hive -e "use $db; SHOW PARTITIONS t1" | grep wk | wc -l` < 2)) ; then
    exit;
fi
partition=`hive -e "use $db; SHOW PARTITIONS t1" | grep wk | head -1`;
hive -e "use $db; ALTER TABLE t1 DROP PARTITION ($partition)";