一部のデータを処理するために 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