web-dev-qa-db-ja.com

パーティションテーブルでのハイブロード

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つの非常に類似したテーブルがあります。中間として外部テーブルを作成する必要があります。

15

Ning Zhangは http://grokbase.com/t/Hive/user/114frbfg0y/can-i-use-Hive-dynamic-partition-while-loading-data-into-テーブル

簡単なコンテキストは次のとおりです。

  1. ロードデータは単にデータをコピーするだけで、それを読み取らないので、何をパーティション分割するかわからない
  2. 最初にデータを中間テーブルにロードする(またはすべてのファイルを指す外部テーブルを使用する)ことをお勧めします。次に、パーティションの動的挿入を有効にして、パーティションテーブルにロードします。
16
Denny Lee
  1. @Denny Leeの答えで述べたように、管理対象または外部のステージングテーブル(invites_stg)を関与させてから、ステージングテーブルからパーティションテーブルにINSERTする必要があります(この場合は招待します)。

  2. 次の2つのプロパティが設定されていることを確認してください。

    SET Hive.exec.dynamic.partition=true;
    SET Hive.exec.dynamic.partition.mode=nonstrict;
    
  3. そして最後に招待状に挿入し、

    INSERT OVERWRITE TABLE India PARTITION (STATE) SELECT COL's FROM invites_stg;
    

ヘルプについては、次のリンクを参照してください。 http://www.edupristine.com/blog/Hive-partitions-example

3
appleboy

これとまったく同じシナリオで作業しましたが、代わりに、ロードする必要のあるパーティションごとに個別のHDFSデータファイルを作成しました。

データはMapReduceジョブから取得されるため、Reducerクラスで MultipleOutputs を使用して、対応するパーティションファイルにデータを多重化しました。その後は、HDFSファイル名のパーティションを使用してスクリプトを作成するだけです。

3

どう?

LOAD DATA INPATH '/path/to/HDFS/dir/file.csv' OVERWRITE INTO TABLE DB.EXAMPLE_TABLE PARTITION (PARTITION_COL_NAME='PARTITION_VALUE');

0
user2720864