在hive中动态删除分区

8ftvxx2r  于 2021-06-03  发布在  Hadoop
关注(0)|答案(2)|浏览(1040)

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

63lcw9qa

63lcw9qa1#

从Hive0.9.0开始,您可以使用ALTERTABLE中的所有比较器。。删除分区语句。这意味着你最初的陈述应该有效。请参见:https://issues.apache.org/jira/browse/hive-2908.

rta7y2nd

rta7y2nd2#

你必须为此编写一个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动态获取时间戳。
执行以上命令,直到您的条件得到满足。

相关问题