私はデータ解析にHadoop - hiveを使用するテレコムプロジェクトに取り組んでいます。ある日、私たちは何百万というレコードを取得します。指定された日数が経過していない場合は、ストレージ容量がないため古いデータを削除する必要があります。レコードを削除する最も良い方法は何ですか?Hadoop - Hive:指定された日数よりも古いデータを削除します。
追加情報:
これらのハイブテーブルが読み込ま日付を持つ列を持つことになります。
私はデータ解析にHadoop - hiveを使用するテレコムプロジェクトに取り組んでいます。ある日、私たちは何百万というレコードを取得します。指定された日数が経過していない場合は、ストレージ容量がないため古いデータを削除する必要があります。レコードを削除する最も良い方法は何ですか?Hadoop - Hive:指定された日数よりも古いデータを削除します。
追加情報:
これらのハイブテーブルが読み込ま日付を持つ列を持つことになります。
あなたの使用例は、あなたの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');
、それがうまく動作します。