6

データ分析に Hadoop - ハイブを使用するテレコム プロジェクトに取り組んでいます。1 日で数百万のレコードが取得されます。指定した日数が経過したら、ストレージ容量がないため、古いデータを削除する必要があります。レコードを削除する最良の方法は何ですか?

追加情報:

これらのハイブテーブルには、データが入力された日付を持つ列があります。

4

1 に答える 1

12

あなたのユースケースは、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');

私はしばらくの間、非常によく似たパターンをうまく使用してきましたが、それはうまく機能します。

于 2013-01-11T16:08:05.917 に答える