2

ハイブに 2 つのテーブルがあり、どちらもタイムスタンプを表す文字列でパーティション分割されています (タイムスタンプでパーティション分割されたテーブルをサポートしていない Cloudera Impala のテーブルを使用しているため、タイムスタンプの代わりに文字列を使用します)。

テーブルは、特定のタイム スライスに大量のデータを格納するために使用されます。最初のテーブルには、より高い時間粒度で最新のデータが含まれています。たとえば、1 分のタイム スライスであり、2 番目のテーブルには、より低い粒度で、たとえば 1 時間のタイム スライスです。

そのため、1 分のタイム スライスの特定の時間よりも古いデータを合計して、1 時間のタイム スライスのデータを取得し、それを 1 時間のタイム スライスでテーブルに挿入するクエリがあります。

1 時間のタイム スライスを作成した後、新しい 1 時間のタイム スライスに含まれる 1 分のタイム スライスをすべて削除したいと考えています。また、テーブルは時間を表す文字列で分割されているため、対応するパーティションを削除するだけです。

そして、私の実際の質問を知っています:

ハイブでどうにかしてパーティションをドロップすることは可能ですか

 ALTER TABLE oneMinSlices DROP IF EXISTS PARTITION(time < 'YYYY-MM-DD HH:MM:SS')

よろしくお願いします。

ps: なぜ私がこれを行っているのか疑問に思っている場合: データは継続的に成長しており、1 分のタイム スライスを削除しないと、それらを含むテーブルが非常に大きくなり、クエリが遅くなり、多くのクエリが必要になります。スペースの。

4

2 に答える 2

6

Hive 0.9.0 以降、ALTER TABLE .. DROP PARTITION ステートメントですべてのコンパレーターを使用できます。これは、元のステートメントが機能することを意味します。https://issues.apache.org/jira/browse/HIVE-2908を参照してください。

于 2013-10-01T22:37:38.350 に答える
1

そのためのシェル スクリプトを作成する必要があります。

.hql ファイルで、クエリの下に書き込みます

ALTER TABLE oneMinSlices DROP IF EXISTS PARTITION(time = '${hiveconf:timestamp}')

パーティションをコマンド ライン引数として動的に渡すようになりました。

hive -hiveconf timestamp=2013-04-22\ 05:12:20 -f hqlfilepath.hql

最後のステップは、シェルから動的にタイムスタンプを取得することです。

条件が満たされるまで上記のコマンドを実行します。

于 2013-04-22T12:20:53.330 に答える