2013-01-11 2 views
5

私はデータ解析にHadoop - hiveを使用するテレコムプロジェクトに取り組んでいます。ある日、私たちは何百万というレコードを取得します。指定された日数が経過していない場合は、ストレージ容量がないため古いデータを削除する必要があります。レコードを削除する最も良い方法は何ですか?Hadoop - Hive:指定された日数よりも古いデータを削除します。

追加情報:

これらのハイブテーブルが読み込ま日付を持つ列を持つことになります。

答えて

11

あなたの使用例は、あなたのHiveテーブルの "day"パーティションを使用するのに非常に適していると思います。 「日」が列のみの場合は、テーブルを維持管理するのが難しくなります。パーティションが本当にハイブに意味は何

により、たとえばので

をそれぞれ「日」のためのディレクトリを持っているということです:あなたはデータを追加するとき

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

は、だから、たとえば、次のを持っているでしょうHDFSの構造:

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

各パーティションには、その日のコンテンツがあります。

は次に古いデータを削除すると些細なり、あなたは、たとえば、毎日実行され、前のx日間のデータを削除するcronジョブを持っている(例えばコマンドdate --date '30 days ago' +\%Y-\%m-\%dを使用)、単に次のコマンドを行うことができます:

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

show partitions mytableを実行しても、Hiveテーブルにパーティションが残っていますが、データを削除したパーティションのクエリは何も返しません。あなたが本当にメタストアにパーティションを削除したい場合は、次のコマンドを使用する必要があります。私はしばらくの間、首尾よく似たパターンを使用してきた

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

、それがうまく動作します。

関連する問題