Подтвердить что ты не робот

Свиньи - как ссылаться на колонки в 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.

4b9b3361

Ответ 1

Что вы ищете, это "Disambiguate Operator" . Вы хотите A::id, а не A.id.

A.id говорит: "существует отношение/сумка 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;

Ответ 2

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

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

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