私は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;
ただし、これは入力された日付と曜日に応じて自動化されていないオフコースです
日付範囲または日付演算に従ってパーティションをロードするように外部テーブルに定義できる方法はありますか?
非常によく似た問題があり、移行後、データはあるがメタデータはないテーブルを再作成する必要があります。テーブルを再作成した後の解決策は次のようです。
MSCK REPAIR TABLE table_name;
これは、OPが自分の投稿にコメントした"alter table X recover partitions"
にも言及しています。 MSCK REPAIR TABLE table_name;
はAmazon-EMR以外の実装(私の場合はCloudera)で動作します。
パーティションはデータの物理的なセグメント化であり、パーティションはディレクトリシステムによって維持され、クエリはメタデータを使用してパーティションの場所を決定します。したがって、ディレクトリ構造をクエリと一致させることができれば、必要なデータが見つかるはずです。例えば:
select count(*) from table_name where (d >= '2011-08-03) and (d <= '2011-08-09');
しかし、それ以外の日付範囲操作については知りません。最初にクエリパターンを作成するために計算を行う必要があります。
外部テーブルを作成し、それらに場所を定義するパーティションを追加することもできます。これにより、必要に応じてデータを細断処理しながら、パーティションスキームを使用してクエリを最適化できます。
Hiveにはこれに組み込まれた機能はないと思います。プラグインを書くことができるかもしれません。 カスタムUDFの作成
おそらくこれについて言及する必要はありませんが、パラメーターを受け取り、コマンドをハイブにパイプする単純なbashスクリプトを検討しましたか?
Oozieワークフローは別のオプションですが、それはやり過ぎかもしれません。 Oozie Hive Extension -少し考えた後、Oozieがこれに役立つとは思わない。