2

我在 hive 中有两个表,都由表示时间戳的字符串分区(我使用字符串而不是时间戳,因为我使用的是 Cloudera Impala 中的表,它不支持按时间戳分区的表)。

这些表用于在特定时间片中存储大量数据。第一个表包含较高时间粒度的最新数据,比如 1 分钟时间片,第二个表包含较低粒度的旧数据,比如 1 小时时间片。

所以我有一个查询,它总结了早于 1 分钟时间片的特定时间量的数据,以便我拥有 1 小时时间片的数据并将其与 1 小时时间片一起插入我的表中。

创建 1 小时时间片后,我想删除新的 1 小时时间片中包含的所有 1 分钟时间片。而且由于该表是由代表时间的字符串分区的,所以我可以删除相应的分区。

并知道我的实际问题:

是否有可能在蜂巢中以某种方式删除分区

 ALTER TABLE oneMinSlices DROP IF EXISTS PARTITION(time < 'YYYY-MM-DD HH:MM:SS')

在此先感谢您的帮助。

ps:如果你想知道我为什么这样做:数据在持续增长,如果我们不删除 1 分钟的时间片,包含它们的表会变得非常大,导致我们的查询变慢并且需要很多的空间。

4

2 回答 2

6

从 Hive 0.9.0 开始,您可以在 ALTER TABLE .. DROP PARTITION 语句中使用所有比较器。这意味着您的原始陈述应该有效。请参阅:https ://issues.apache.org/jira/browse/HIVE-2908 。

于 2013-10-01T22:37:38.350 回答
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 中动态获取时间戳。

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

于 2013-04-22T12:20:53.330 回答