8

Apache Pigで「すべてaAどこa.field == b.fieldに保持するか」に相当することを実行したいと思います。私はそれをそのように実装しています、bB

AB_joined = JOIN A by field, B by field;
A2 = FOREACH AB_joined GENERATE A::field as field, A::field2 as field2, A::field3 as field3;

のすべてのエントリを列挙するのAは非常にばかげているので、次のようにしたいと思います。

A2 = FOREACH AB_joined GENERATE flatten(A);

ただし、これは機能しないようです。Aのフィールドを列挙せずに同等のことを行うことができる他の方法はありますか?

4

4 に答える 4

5

これはうまくいくはずです:

A2 = FOREACH AB_joined GENERATE $0..
于 2012-08-29T14:40:47.000 に答える
3

COGROUP を使用して、A の列を B の列から分離しておくことができます。これは、A のスキーマが動的であり、A のスキーマが変更されたときにコードが失敗したくない場合に特に役立ちます。

AB = COGROUP A BY field, B BY field;

-- schema of AB will be:
-- {group, A:{all fields of A}, B:{all fields of B}}

A2 = FOREACH AB FLATTEN(A);

お役に立てれば。

于 2014-09-15T11:48:19.053 に答える
2

少なくとも pig 0.9.1 以降では、Star ExpressionsまたはProject-Range Expressions のいずれかを使用して、タプルから複数のフィールドを選択できます。詳細については、Pig Latin 0.15.0、式の章を参照してください。

これは、理解を深めるために作成した私の例です。

-- A: {id: long, f1: int, f2: int, f3: int, f4: int}
-- B: {id: long, f5: int}

AとBを結合してAのフィールドだけを選択しよう

AB = FOREACH (JOIN A BY id, B by id) GENERATE $0..$4;
--AB: {A::id: long, A::f1: int, A::f2: int, A::f3: int, A::f4: int}

また

BA = FOREACH (JOIN B BY id, A by id) GENERATE $2..;
--BA: {A::id: long, A::f1: int, A::f2: int, A::f3: int, A::f4: int}

スター式を使用してすべてのフィールドを選択する

AB = FOREACH (JOIN A BY id, B by id) GENERATE *;
--AB: {A::id: long, A::f1: int, A::f2: int, A::f3: int, A::f4: int, B::id: long, B::f5: int}

プロジェクト範囲式を使用して、すべての個別のフィールド (B::id フィールドを除く) を選択する

AB = FOREACH (JOIN A BY id, B by id) GENERATE $0..$4, f5;
--AB: {A::id: long, A::f1: int, A::f2: int, A::f3: int, A::f4: int, B::f5: int}

1 つのリレーションに数十のフィールドがあり、別のリレーションでは対になっているだけの場合に、非常に便利な場合があります。

于 2015-07-21T11:15:32.240 に答える