apache-pig

Reference columns in a FOREACH after a JOIN?


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;

4th line fails on: Invalid field projection. Projected field [id] does not exist in schema

I tried to change to A.id but then the last line fails on: ERROR 0: Scalar has more than one row in the output.


Solution

  • What you are looking for is the "Disambiguate Operator". What you want is A::id, not A.id.

    A.id says "there is a relation/bag A and there is a column called id in its schema"

    A::id says "there is a record from A and that has a column called id"

    So, you would do:

    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 dirty alternative:

    Just because I'm lazy, and disambiguation gets really weird when you start doing multiple joins one after another: use unique identifiers.

    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;