我在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
如果您的分区是按日期排序的,您可以编写一个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)";