我在hive中有两个表,都由表示时间戳的字符串进行分区(我使用的是字符串而不是时间戳,因为我使用的是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条答案
按热度按时间63lcw9qa1#
从Hive0.9.0开始,您可以使用ALTERTABLE中的所有比较器。。删除分区语句。这意味着你最初的陈述应该有效。请参见:https://issues.apache.org/jira/browse/hive-2908.
rta7y2nd2#
你必须为此编写一个shell脚本。
在.hql文件中写入以下查询
现在将分区作为命令行参数动态传递。
最后一步是从shell动态获取时间戳。
执行以上命令,直到您的条件得到满足。