在配置单元中动态删除分区

时间:2013-04-10 11:55:49

标签: hadoop hive hiveql

我在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分钟的时间片,那么包含它们的表就会变得非常大,导致我们的查询速度变慢需要很大的空间。

2 个答案:

答案 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动态获取时间戳。

运行以上命令,直到满足您的条件。