17

HDFS にログ ファイルがあり、値はコンマで区切られています。例えば:

2012-10-11 12:00,opened_browser,userid111,deviceid222

ここで、このファイルを、列「タイムスタンプ」、「アクション」を持ち、「ユーザー ID」、「デバイス ID」で分割された 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 つの非常に類似したテーブルが作成されます。または、外部テーブルを中間として作成する必要があります。

4

5 に答える 5

17

Ning Zhang は、 http: //grokbase.com/t/hive/user/114frbfg0y/can-i-use-hive-dynamic-partition-while-loading-data-into-tablesで、このトピックについて素晴らしい反応を示しています。

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

  1. データのロードは単にデータをコピーするだけで、読み取らないため、何を分割するかを判断できません
  2. 最初にデータを中間テーブルにロードして (またはすべてのファイルを指す外部テーブルを使用して)、パーティションの動的挿入を開始してパーティション テーブルにロードすることをお勧めします。
于 2012-11-05T00:45:56.070 に答える
3

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

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

于 2013-01-11T14:59:34.863 に答える