8 Stimmen

Generierung aller Felder aus einem Alias nach einem JOIN in Pig

Ich möchte das Äquivalent von "alle behalten" durchführen a en A donde a.field == b.field für einige b en B " in Apache Pig. Ich implementiere es wie folgt,

AB_joined = JOIN A by field, B by field;
A2 = FOREACH AB_joined GENERATE A::field as field, A::field2 as field2, A::field3 as field3;

Aufzählung aller A ist ziemlich albern, und ich würde lieber so etwas machen wie,

A2 = FOREACH AB_joined GENERATE flatten(A);

Dies scheint jedoch nicht zu funktionieren. Gibt es einen anderen Weg, wie ich etwas Gleichwertiges tun kann, ohne die Aufzählung A die Felder?

5voto

Sateesh Punkte 51

Das sollte funktionieren:

A2 = FOREACH AB_joined GENERATE $0..

3voto

Gaurav Phapale Punkte 959

Sie können COGROUP verwenden, um die Spalten von A von den Spalten von B zu trennen. Dies ist besonders nützlich, wenn das Schema von A dynamisch ist und Sie nicht wollen, dass Ihr Code fehlschlägt, wenn sich das Schema von A ändert.

AB = COGROUP A BY field, B BY field;

-- schema of AB will be:
-- {group, A:{all fields of A}, B:{all fields of B}}

A2 = FOREACH AB FLATTEN(A);

Ich hoffe, das hilft.

2voto

dezhik Punkte 970

Mindestens ab Schwein 0.9.1 können Sie entweder Star-Ausdrücke o Projektbereich-Ausdrücke um mehrere Felder aus einem Tupel auszuwählen. Lesen Pig Latin 0.15.0, Kapitel Ausdrücke für Details.

Hier ist mein Beispiel, das ich nur gemacht habe, damit Sie es verstehen.

-- A: {id: long, f1: int, f2: int, f3: int, f4: int}
-- B: {id: long, f5: int}

Verknüpfen wir A und B und wählen wir nur die Felder von A aus

AB = FOREACH (JOIN A BY id, B by id) GENERATE $0..$4;
--AB: {A::id: long, A::f1: int, A::f2: int, A::f3: int, A::f4: int}

o

BA = FOREACH (JOIN B BY id, A by id) GENERATE $2..;
--BA: {A::id: long, A::f1: int, A::f2: int, A::f3: int, A::f4: int}

Auswahl aller Felder mit Star-Ausdruck

AB = FOREACH (JOIN A BY id, B by id) GENERATE *;
--AB: {A::id: long, A::f1: int, A::f2: int, A::f3: int, A::f4: int, B::id: long, B::f5: int}

Auswahl aller eindeutigen Felder (ohne das Feld B::id) mit dem Ausdruck Project-range

AB = FOREACH (JOIN A BY id, B by id) GENERATE $0..$4, f5;
--AB: {A::id: long, A::f1: int, A::f2: int, A::f3: int, A::f4: int, B::f5: int}

Manchmal ist es wirklich nützlich, wenn Sie in einer Beziehung Dutzende von Feldern haben und in einer anderen nur ein paar.

2voto

Duke Dogs Punkte 81

Mit Pig 12 und höher, verwenden Sie PluckTuple: https://pig.apache.org/docs/r0.12.0/func.html#plucktuple .

AB_joined = JOIN A by field, B by field;
DEFINE pluck PluckTuple('A::');
A2 = FOREACH AB_joined generate FLATTEN(pluck(*));

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X