2013-01-11 39 views
5

我正在開發一個電信項目,該項目使用Hadoop-hive進行數據分析。有一天,我們將獲得數百萬條記錄。經過指定的天數之後,我們需要刪除舊數據,因爲我們沒有存儲容量。什麼是刪除記錄的最佳方式?Hadoop - Hive:刪除比指定日期早的數據

附加信息:

這些蜂巢表將具有其中具有填充日期的列。

回答

11

我認爲你的用例非常適合在你的Hive表中使用「日」分區。如果「日」只是一列,將很難維護和清潔你的桌子。

分區的真正含義在蜂巢是什麼,你將有一個目錄,每個「天」

因此,例如:

create table mytable (
    ... 
) partitioned by (day string) 

所以,當你添加數據,您將有例如以下HDFS中的結構:

/user/hive/warehouse/mytable/day=2013-01-10 
/user/hive/warehouse/mytable/day=2013-01-11 
... 

而在每個分區中,您將擁有當天的內容。

然後刪除舊數據變得不那麼重要,例如,你可以有日常運行和(使用命令date --date '30 days ago' +\%Y-\%m-\%d例如)前刪除X天的數據,僅僅做到以下命令cron作業:

hadoop fs -rmr -skiptrash /user/hive/warehouse/mytable/day=`date --date '30 days ago' +\%Y-\%m-\%d` 

此時,如果您執行show partitions mytable,但您對Hive表中的分區仍有分區,但對刪除數據的分區的任何查詢都不會返回任何內容。如果你想真正刪除該分區在metastore你必須使用下面的命令:

ALTER TABLE mytable DROP PARTITION (day='xxxx-xx-xx'); 

我一直在使用一個非常類似的模式成功了一段時間,效果很好。

相關問題