0

一部のデータを処理するために Pig 0.6 を使用しています。データの列の 1 つは、スペースで区切られた ID のリストです (例: 35 521 225)。これらの ID の 1 つを、次のような 2 列のマッピングを含む別のファイルにマップしようとしています (したがって、列 1 はデータであり、列 2 はサードパーティのデータです)。

35 6009
521 21599
225 51991
12 6129

列の値 ("35 521 225") とファイルからのマッピングを受け取る UDF を作成しました。次に、列の値を分割し、それぞれを反復処理して、渡されたマッピングから最初にマップされた値を返します (これが論理的に機能する方法と考えてください)。

次のように PIG にデータをロードしています。

data = LOAD 'input.txt' USING PigStorage() AS (name:chararray, category:chararray);

mappings = LOAD 'mappings.txt' USING PigStorage() AS (ourId:chararray, theirId:chararray);

次に、生成は次のとおりです。

output = FOREACH data GENERATE title, com.example.ourudf.Mapper(category, mappings);

ただし、エラーは次
のとおりです。

Pig は元のデータで "mappings" という列を見つけようとしているようです。コースがそこにない場合。UDF に読み込まれたリレーションを渡す方法はありますか?

ここで PIG の「Map」タイプが役立つ方法はありますか? それとも、どうにかして値を結合する必要がありますか?

編集: より具体的に言えば、すべてのカテゴリ ID をサード パーティの ID にマップする必要はありません。最初にマップしたかっただけです。UDF はカテゴリ ID のリストを反復処理し、最初にマップされた値が見つかったときに戻ります。したがって、入力が次のようになっているとします。

someProduct\t35 521 225

出力は次のようになります:
someProduct\t6009

4

1 に答える 1

2

Pig でこの待機を行うことはできないと思います。

やりたいことと同様の解決策は、マッピング ファイルを UDF にロードしてから、各レコードを FOREACH で処理することです。例は PiggyBank LookupInFilesにあります。DFS からファイルを直接コピーする代わりに、 DistributedCacheを使用することをお勧めします。

DEFINE MAP_PRODUCT com.example.ourudf.Mapper('hdfs://../mappings.txt');

data = LOAD 'input.txt' USING PigStorage() AS (name:chararray, category:chararray);

output = FOREACH data GENERATE title, MAP_PRODUCT(category);

これは、マッピング ファイルが大きすぎない場合に機能します。メモリに収まらない場合は、マッピング ファイルを分割してスクリプトを数回実行するか、行番号を追加してマッピング ファイルのスキーマを微調整し、製品ごとにネイティブ結合とネストされた FOREACH ORDER BY/LIMIT 1 を使用する必要があります。

于 2010-09-24T20:38:42.100 に答える