2013-06-19 13 views
6

mam paszy w następującym formacie:Grupa przez wielu polach i wyjściowego krotki

Hour Key ID Value 
    1 K1 001  3 
    1 K1 002  2 
    2 K1 005  4 
    1 K2 002  1 
    2 K2 003  5 
    2 K2 004  6 

i chcę grupy pasza przez (Hour, Key) następnie zsumować Value ale zachować ID jak krotki:

({1, K1}, {001, 002}, 5) 
({2, K1}, {005}, 4) 
({1, K2}, {002}, 1) 
({2, K2}, {003, 004}, 11) 

Wiem, jak używać FLATTEN do generowania sumy Value, ale nie wiem, jak wypisać ID jako krotkę. Oto, co mam do tej pory:

A = LOAD 'data' AS (Hour:chararray, Key:chararray, ID:chararray, Value:int); 
B = GROUP A BY (Hour, Key); 
C = FOREACH B GENERATE 
    FLATTEN(group) AS (Hour, Key), 
    SUM(A.Value) AS Value 
; 

Czy wyjaśnisz, jak to zrobić? Doceniam to!

+0

można podać stan końcowy/wyjścia szukasz - nie bardzo rozumiem co masz na myśli przez „id wyjściowego jako krotki” –

+0

@Chris, stan końcowy byłby jakoś jak kawałek mam powyżej : '(Godzina, klucz)' jako klucz, wszystkie związane z nim 'ID (y) 'jak w krotce (jak' {001, 002} ', itp.) Plus suma' wartości'. Proszę dać mi znać, jeśli ma to sens. Dzięki! – Rock

Odpowiedz

7

Wystarczy użyć operatora rzutu workiem, .. Spowoduje to utworzenie nowego worka, w którym krotki mają tylko te elementy, które określisz. W twoim przypadku użyj A.ID. W rzeczywistości już używasz tego operatora do dostarczenia danych wejściowych do SUM - dane wejściowe do sumy to worek z jednoelementowymi krotkami, które tworzysz, wyświetlając pole Value.

A = LOAD 'data' AS (Hour:chararray, Key:chararray, ID:chararray, Value:int); 
B = GROUP A BY (Hour, Key); 
C = FOREACH B GENERATE 
    FLATTEN(group) AS (Hour, Key), 
    A.ID, 
    SUM(A.Value) AS Value 
; 
+0

Dziękuję bardzo, Winnie. To jest świetne. Chyba wciąż potrzebuję lepszego zrozumienia, jak torba działa w Pig. Dzięki! – Rock