apache-pig - script - pig latin apache pig
cerdo-¿cómo hacer referencia a las columnas en una FOREACH después de un JOIN? (2)
@nweiler: si conoce el primer y último campo de la relación A, puede escribir algo como a continuación:
D = FOREACH C GENERATE A::FirstCol..A:LastCol ;
Esto le dará todas las columnas entre FirstCol y LastCol.
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;
4ta línea falla en: Invalid field projection. Projected field [id] does not exist in schema
Invalid field projection. Projected field [id] does not exist in schema
Intenté cambiar a A.id pero la última línea falla: ERROR 0: Scalar has more than one row in the output.
Lo que está buscando es el "Operador Desambiguar" . Lo que quieres es A::id
, no A.id
A.id
dice "hay una relación / bolsa A
y hay una columna llamada id
en su esquema"
A::id
dice "hay un registro de A
y tiene una columna llamada id
"
Entonces, harías:
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;
Una alternativa sucia:
Solo porque soy perezoso, y la desambiguación se vuelve realmente extraña cuando empiezas a hacer varias combinaciones una tras otra: usa identificadores únicos.
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;