データ分析に Hadoop - ハイブを使用するテレコム プロジェクトに取り組んでいます。1 日で数百万のレコードが取得されます。指定した日数が経過したら、ストレージ容量がないため、古いデータを削除する必要があります。レコードを削除する最良の方法は何ですか?
追加情報:
これらのハイブテーブルには、データが入力された日付を持つ列があります。
あなたのユースケースは、Hiveテーブルで「日」パーティションを使用するのに非常に適していると思います。「日」が単なる列である場合、テーブルの保守と清掃が困難になります。
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
...
そして、各パーティションには、その日のコンテンツがあります。
次に、古いデータの削除は簡単になります。たとえば、毎日実行され、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');
私はしばらくの間、非常によく似たパターンをうまく使用してきましたが、それはうまく機能します。