свинья - как ссылаться на столбцы в FOREACH после JOIN? - PullRequest
21 голосов
/ 08 ноября 2011
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.

Ответы [ 2 ]

45 голосов
/ 09 ноября 2011

То, что вы ищете, это "оператор устранения неоднозначности" . То, что вы хотите, это A::id, а не A.id.

A.id говорит "есть отношение / bag A и в его схеме есть столбец с именем id"

A::id говорит "есть запись из A, в которой есть столбец с именем 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;
0 голосов
/ 11 марта 2016

@ nweiler: если вы знаете первое и последнее поле отношения A, вы можете написать что-то вроде следующего:

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

Это даст вам все столбцы между FirstCol и LastCol.

...