web-dev-qa-db-ja.com

ハイブ:外部テーブルに動的パーティションを追加

私はHive071を実行しており、次のディレクトリレイアウトを持つ既存のデータを処理しています。
-TableName
-d =(例:2011-08-01)
-d = 2011-08-02
-d = 2011-08-

...など
各日付の下に日付ファイルがあります。
使用しているデータをロードします

CREATE EXTERNAL TABLE table_name (i int)  
PARTITIONED BY (date String)  
LOCATION '${hiveconf:basepath}/TableName';**  

Hiveスクリプトで、入力日と日数に応じて関連するパーティションを読み込めるようにしたいと思います。したがって、合格した場合date = '2011-08-03'およびdays = '7'
スクリプトは次のパーティションをロードする必要があります-d = 2011-08-03
-d = 2011-08-04
-d = 2011-08-05
-d = 2011-08-06
-d = 2011-08-07
-d = 2011-08-08
-d = 2011-08-09

明示的に実行する以外に、それを行うための明確な方法は見つかりませんでした。

ALTER TABLE table_name ADD PARTITION (d='2011-08-03');  
ALTER TABLE table_name ADD PARTITION (d='2011-08-04');  
ALTER TABLE table_name ADD PARTITION (d='2011-08-05');  
ALTER TABLE table_name ADD PARTITION (d='2011-08-06');  
ALTER TABLE table_name ADD PARTITION (d='2011-08-07');  
ALTER TABLE table_name ADD PARTITION (d='2011-08-08');  
ALTER TABLE table_name ADD PARTITION (d='2011-08-09');  

クエリを実行します

select count(1) from table_name;

ただし、これは入力された日付と曜日に応じて自動化されていないオフコースです

日付範囲または日付演算に従ってパーティションをロードするように外部テーブルに定義できる方法はありますか?

18
Tomer

非常によく似た問題があり、移行後、データはあるがメタデータはないテーブルを再作成する必要があります。テーブルを再作成した後の解決策は次のようです。

MSCK REPAIR TABLE table_name;

ここで説明

これは、OPが自分の投稿にコメントした"alter table X recover partitions"にも言及しています。 MSCK REPAIR TABLE table_name;はAmazon-EMR以外の実装(私の場合はCloudera)で動作します。

8
Ptah

パーティションはデータの物理的なセグメント化であり、パーティションはディレクトリシステムによって維持され、クエリはメタデータを使用してパーティションの場所を決定します。したがって、ディレクトリ構造をクエリと一致させることができれば、必要なデータが見つかるはずです。例えば:

select count(*) from table_name where (d >= '2011-08-03) and (d <= '2011-08-09');

しかし、それ以外の日付範囲操作については知りません。最初にクエリパターンを作成するために計算を行う必要があります。

外部テーブルを作成し、それらに場所を定義するパーティションを追加することもできます。これにより、必要に応じてデータを細断処理しながら、パーティションスキームを使用してクエリを最適化できます。

0
rgordon0

Hiveにはこれに組み込まれた機能はないと思います。プラグインを書くことができるかもしれません。 カスタムUDFの作成

おそらくこれについて言及する必要はありませんが、パラメーターを受け取り、コマンドをハイブにパイプする単純なbashスクリプトを検討しましたか?

Oozieワークフローは別のオプションですが、それはやり過ぎかもしれません。 Oozie Hive Extension -少し考えた後、Oozieがこれに役立つとは思わない。

0
brandon.bell