我有一个Hive(ver 0.11.0)表,按列日期划分,类型为string。我想知道在Hive中是否存在一种方法,我可以通过该方法删除一系列日期的分区(例如从'date1'到'date2')。我尝试了以下(SQL类型)查询,但它们似乎在语法上不正确:
ALTER TABLE myTable DROP IF EXISTS PARTITION
(date>='date1' and date<='date2');
ALTER TABLE myTable DROP IF EXISTS PARTITION
(date>='date1' && date<='date2');
ALTER TABLE myTable DROP IF EXISTS PARTITION
(date between 'date1' and 'date2');
答案 0 :(得分:5)
我尝试了这种语法。
ALTER TABLE mytable DROP PARTITION (dates>'2018-04-14',dates<'2018-04-16');
命令输出:
Dropped the partition dates=2018-04-15/country_id=107
Dropped the partition dates=2018-04-15/country_id=110
Dropped the partition dates=2018-04-15/country_id=112
Dropped the partition dates=2018-04-15/country_id=14
Dropped the partition dates=2018-04-15/country_id=157
Dropped the partition dates=2018-04-15/country_id=159
Dropped the partition dates=2018-04-15/country_id=177
Dropped the partition dates=2018-04-15/country_id=208
Dropped the partition dates=2018-04-15/country_id=22
Dropped the partition dates=2018-04-15/country_id=233
Dropped the partition dates=2018-04-15/country_id=234
Dropped the partition dates=2018-04-15/country_id=76
Dropped the partition dates=2018-04-15/country_id=83
OK
Time taken: 0.706 seconds
我正在使用,Hive 1.2.1000.2.5.5.0-157
答案 1 :(得分:1)
我认为迄今为止没有任何有效的解决方案。我使用一些shell脚本实现了此问题的解决方法,例如:
for y in {2011..2014}
do
for m in {01..12}
do
echo -n "ALTER TABLE reporting.frontend DROP IF EXISTS PARTITION (year=0000,month=00,day=00,hour=00)"
for d in {01..31}
do
for h in {01..23}
do
echo -n ", PARTITION (year=$y,month=$m,day=$d,hour=$h)"
done
done
echo ";"
done
done > drop_partitions_v1.hql
生成的.hql文件可以使用hive(或beeline)-f选项简单地执行。
显然,循环应该能够生成你想要删除的范围,这可能是非常重要的。在最坏的情况下,您需要使用几个这样的shell脚本才能删除所需的日期范围。
此外,请注意,在我的情况下,分区有四个键(年,月,日,小时)。如果你的日期/分区被编码为字符串(在我看来不是一个好主意),你将不得不建立&#39; shell脚本中的变量y,m,d和h中的目标字符串,并在echo命令中绘制字符串。顺便说一句,虚拟分区(仅包含0个)就在那里,以便通过3-4个循环轻松写入整个“ALTER TABLE”。命令,它有一个特殊的语法。
答案 2 :(得分:1)
解决方案:alter table myTable drop partition (unix_timestamp('date1','yyyy-MM-dd')>unix_timestamp(myDate,'yyyy-MM-dd'),unix_timestamp('date2','yyyy-MM-dd')<unix_timestamp(myDate,'yyyy-MM-dd'));