我在hive中有两个表,它们都用表示时间戳的String分区(我使用字符串而不是时间戳,因为我使用的是Cloudera Impala中的表,它不支持按时间戳分区的表)
这些表用于在特定时间片中存储大量数据。 第一个表包含更高时间粒度的最新数据,比如1分钟时间片和第二个较低粒度的旧数据,这里说1小时时间片。
所以我有一个查询,它总结了比1分钟时间片的特定时间更早的数据,这样我就可以获得1小时时间片的数据并将其插入到我的表中,时间为1小时切片。
创建1小时时间片后,我想删除新1小时时间片中包含的所有1分钟时间片。并且由于表是由表示时间的字符串分区的,因此我可以删除相应的分区。
了解我的实际问题:
是否可能在hive中以某种方式删除分区
ALTER TABLE oneMinSlices DROP IF EXISTS PARTITION(time < 'YYYY-MM-DD HH:MM:SS')
提前感谢您的帮助。
ps:如果你想知道为什么我这样做:数据是持续增长的,如果我们不删除1分钟的时间片,那么包含它们的表就会变得非常大,导致我们的查询速度变慢需要很大的空间。答案 0 :(得分:6)
从Hive 0.9.0开始,您可以在ALTER TABLE .. DROP PARTITION语句中使用所有比较器。这意味着您的原始陈述应该有效。请参阅:https://issues.apache.org/jira/browse/HIVE-2908。
答案 1 :(得分:1)
你必须为此编写一个shell脚本。
在.hql文件中写下面的查询
ALTER TABLE oneMinSlices DROP IF EXISTS PARTITION(time = '${hiveconf:timestamp}')
现在动态地将分区作为命令行参数传递。
hive -hiveconf timestamp=2013-04-22\ 05:12:20 -f hqlfilepath.hql
最后一步是从shell动态获取时间戳。
运行以上命令,直到满足您的条件。