删除HIVE中的一系列分区

时间:2015-10-16 13:26:40

标签: hive hql

我有一个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');

3 个答案:

答案 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_t‌​imestamp('date2','yy‌​yy-MM-dd')<unix_time‌​stamp(myDate,'yyyy-M‌​M-dd'));