web-dev-qa-db-ja.com

pig-JOINの後にFOREACHで列を参照する方法

A = load 'a.txt' as (id, a1);
B = load 'b.txt as (id, b1);
C = join A by id, B by id;
D = foreach C generate id,a1,b1;
dump D;

4行目で失敗します:Invalid field projection. Projected field [id] does not exist in schema

A.idに変更しようとしましたが、最後の行が失敗しました:ERROR 0: Scalar has more than one row in the output.

21
ihadanny

あなたが探しているのは "Disambiguate Operator" です。必要なのはA::idではなくA.idです。

A.idは、「relation/bagAがあり、idという列があるそのスキーマ」

A::idは、「Aからのrecordがあり、idという列がある」と言います。

だから、あなたはそうするでしょう:

A = load 'a.txt' as (id, a1);
B = load 'b.txt as (id, b1);
C = join A by id, B by id;
D = foreach C generate A::id,a1,b1;
dump D;

汚い選択肢:

私が怠惰で、次々に複数の結合を開始すると、曖昧さの解消が非常に奇妙になります。一意の識別子を使用してください。

A = load 'a.txt' as (ida, a1);
B = load 'b.txt as (idb, b1);
C = join A by ida, B by idb;
D = foreach C generate ida,a1,b1;
dump D;
48
Donald Miner

@nweiler:関係Aの最初と最後のフィールドがわかっている場合は、次のように記述できます。

     D = FOREACH C GENERATE A::FirstCol..A:LastCol ;

これにより、FirstColとLastColの間のすべての列が表示されます。

0
Ravi Singh