2015-10-16 37 views
3

我有一個按字段日期分組的字符串類型的Hive(版本0.11.0)表。我想知道在Hive中是否存在一種方法,通過這種方法我可以刪除一系列日期的分區(例如從'date1'到'date2')。我嘗試了以下(SQL類型)查詢,但它們似乎在語法上不正確:刪除HIVE中的一系列分區

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'); 

回答

1

我不認爲有任何有效的解決方案到目前爲止。

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文件可以通過蜂房(或直線)-f選項可以簡單地執行:我使用一些shell腳本,例如像實施瞭解決此問題的。

很明顯,循環應該能夠生成你想要刪除的範圍,這可能是非常重要的。在最糟糕的情況下,您需要使用幾個這樣的shell腳本才能刪除所需的日期範圍。

此外,請注意,在我的情況下,分區有四個鍵(年,月,日,小時)。如果你的日期/分區被編碼爲字符串(我認爲這不是一個好主意),你將不得不從shell腳本中的變量y,m,d和h'構建'你的目標字符串,並將字符串繪製在裏面回聲命令。順便說一下,虛擬分區(僅包含0)就在那裏,以便通過3-4循環輕鬆寫入整個'ALTER TABLE'命令,該命令具有特殊的語法。

+1

我對我的用例也使用了類似的方法,通過使用腳本(shell/python/perl等)來處理範圍並使用配置單元cli逐個刪除分區。將這作爲答案。 –

0

您可以嘗試下面的工作。

ALTER TABLE myTable DROP PARTITION (date < 'date1') , PARTITION (date >'date2'); 
+1

查詢低於日期1和上述DATE2所有分區。我想刪除日期之間的所有分區。在查詢中反轉比較器也無濟於事。它會導致所有分區被丟棄爲date2> = date1。 –

+2

解決方案:'alter table myTable drop partition(unix_timestamp('date1','yyyy-MM-dd')> unix_timestamp(myDate,'yyyy-MM-dd'),unix_timestamp('date2','yyyy-MM-dd ') HakkiBuyukcengiz

+1

UGH! 請勿使用上述命令刪除一系列分區!它沒有工作,並放棄他們! – Kent

0

解決方案: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'));