2

これは、あるリレーションのタプルからの 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 (i​​d: long, tag: chararray);

orders = load 's3://bucket/orders.csv' USING PigStorage(',') AS (i​​d: 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)

私は何を間違っていますか?私がやりたいことをするためのより良い方法はありますか?

4

2 に答える 2

0

UDFの問題点はわかりませんが、純粋なPIGで結果を得ることができます。COGROUPおよびIsEmpty組み込み関数を使用します。

x_cases = cogroup orders by (tag_id), tags by (id);
tagged_orders = foreach x_cases generate flatten(orders), IsEmpty(tags);

また

tagged_orders = filter x_cases by not IsEmpty(tags);

それはReduceサイドジョインを使用するため、最速で実行される実装ではないかもしれませんが、それはすべてボリュームに依存します。

より高速なアプローチは、複製結合を使用することです。これにより、タグテーブルがRAMにロードされ、より高速なマップ側結合が使用されます。悪い点は、タグ付けされていないレコードが失われることです。

tagged_orders = join orders by (tag_id), tags by (id) using 'replicated';
于 2012-09-21T10:52:52.233 に答える
0

私は最終的に私自身の問題の解決策を見つけました.2つの関係に対する左外部結合が含まれており、よりエレガントな解決策があるかもしれません.私はより良い解決策を受け入れています.

tags = load 's3://bucket/tags.csv' USING PigStorage(',') AS (i​​d: long, tag: chararray);

orders = load 's3://bucket/orders.csv' USING PigStorage(',') AS (i​​d: long, tag_id: long);

tags = タグでタグをフィルタリング == 'x';

tag_cases = foreach タグは ID を生成します。1 は found_tag:int として。

tag_cases = 個別の tag_cases;

例 = o_id で注文を結合し、外側の tag_cases を id で残します。

example = foreach example generate orders::o_id as id, (tag_cases is null ? 0 : 1) as has_tag;

于 2012-09-24T11:02:55.637 に答える