これは、あるリレーションのタプルからの int 値が、Pig Latin の別のリレーションからの列のメンバー値であるかどうかを判断することに関連しています。私は Pig Latin を初めて使用するので、フレームワークを理解するのが難しいと感じています。
現時点では、2 つのテーブルがあります。1 つは値の小さなドメインを持つタグに対する ID のリストを含み、もう 1 つは ID と他のテーブルを参照するタグ ID を含むタプルを含みます。
ここでは、orders.csv を示します。
ID、タグ
1597年×
999年
787年
812、×
そして tags.csv:
id、tag_id
11、55
99、812
22、787
注文テーブル内のすべてのタプルの tag_id がタグ テーブルの ID のサブセットのメンバーであるかどうかを調べる方法が必要です。
ID、has_x
111、0
99、1
22、0
これは私がこれまでに持っているものです:
jython をタスクとして使用して 's3://bucket/jython_task.py' を登録します。
tags = load 's3://bucket/tags.csv' USING PigStorage(',') AS (id: long, tag: chararray);
orders = load 's3://bucket/orders.csv' USING PigStorage(',') AS (id: long, tag_id: long);
tags = タグでタグをフィルタリング == 'x';
x_cases = foreach タグはタグを生成します。
tagged_orders = foreach オーダーは、id、tag_id、tasks.check_membership(tag_id、x_cases.tag) を is_x:int として生成します。
そしてUDF:
def check_membership(instance, value_list):
if instance != None:
for value in value_list:
if instance == value[0]:
return 1
return 0
エラーが発生します:
2012-09-20 23:53:45,377 [メイン] エラー org.apache.pig.tools.pigstats.SimplePigStats - エラー 2997: バックアップされたエラーから例外を再作成できません: org.apache.pig.backend.executionengine.ExecException: エラー0: スカラーの出力に複数の行があります。1位:(7995)、2位:(8028)
私は何を間違っていますか?私がやりたいことをするためのより良い方法はありますか?