HDFSにログファイルがあり、値はコンマで区切られています。例えば:
_2012-10-11 12:00,opened_browser,userid111,deviceid222
_
ここで、このファイルを、列「timestamp」、「action」、および「userid」、「deviceid」で分割されたHiveテーブルにロードします。ログファイルの最後の2列をテーブルのパーティションとして取得するようにHiveに依頼するにはどうすればよいですか?すべての例e.g. "Hive> LOAD DATA INPATH '/user/myname/kv2.txt' OVERWRITE INTO TABLE invites PARTITION (ds='2008-08-15');"
はスクリプト内のパーティションの定義を必要としますが、HDFSファイルからパーティションを自動的にセットアップしたいです。
1つの解決策は、4列すべてで中間の非パーティションテーブルを作成し、それをファイルから読み込んでINSERT into first_table PARTITION (userid,deviceid) select from intermediate_table timestamp,action,userid,deviceid;
を作成しますが、それは追加タスクであり、2つの非常に類似したテーブルがあります。中間として外部テーブルを作成する必要があります。
Ning Zhangは http://grokbase.com/t/Hive/user/114frbfg0y/can-i-use-Hive-dynamic-partition-while-loading-data-into-テーブル 。
簡単なコンテキストは次のとおりです。
@Denny Leeの答えで述べたように、管理対象または外部のステージングテーブル(invites_stg)を関与させてから、ステージングテーブルからパーティションテーブルにINSERTする必要があります(この場合は招待します)。
次の2つのプロパティが設定されていることを確認してください。
SET Hive.exec.dynamic.partition=true;
SET Hive.exec.dynamic.partition.mode=nonstrict;
そして最後に招待状に挿入し、
INSERT OVERWRITE TABLE India PARTITION (STATE) SELECT COL's FROM invites_stg;
ヘルプについては、次のリンクを参照してください。 http://www.edupristine.com/blog/Hive-partitions-example
これとまったく同じシナリオで作業しましたが、代わりに、ロードする必要のあるパーティションごとに個別のHDFSデータファイルを作成しました。
データはMapReduceジョブから取得されるため、Reducerクラスで MultipleOutputs を使用して、対応するパーティションファイルにデータを多重化しました。その後は、HDFSファイル名のパーティションを使用してスクリプトを作成するだけです。
どう?
LOAD DATA INPATH '/path/to/HDFS/dir/file.csv' OVERWRITE INTO TABLE DB.EXAMPLE_TABLE PARTITION (PARTITION_COL_NAME='PARTITION_VALUE');