2012-06-26 31 views
5

Bir tabloyu Apache Pig içinde tek geçişte döndürmenin mümkün olup olmadığını merak ediyorum.Apache Pig ile Pivot tablo

Girdi:

Id Column1 Column2 Column3 
1  Row11 Row12 Row13 
2  Row21 Row22 Row23 

Çıktı:

Id Name  Value 
1  Column1 Row11 
1  Column2 Row12 
1  Column3 Row13 
2  Column1 Row21 
2  Column2 Row22 
2  Column3 Row23 

gerçek veri sütunları onlarca vardır.

Bunu bir geçişte awk ile yapabilirim ve ardından Hadoop Streaming ile çalıştırın. Ama benim kodumun çoğunluğu Apache Pig'dur, bu yüzden Pig'da verimli bir şekilde yapmanın mümkün olup olmadığını merak ediyorum.

cevap

7

2 yolla bunu yapabilirsiniz: 1. Bir torba dolusu poşet döndüren bir UDF yazın. En esnek çözüm olacak, ancak Java kodunu gerektirir; 2. Yaz böyle sert bir komut dosyası:

inpt = load '/pig_fun/input/pivot.txt' as (Id, Column1, Column2, Column3); 
bagged = foreach inpt generate Id, TOBAG(TOTUPLE('Column1', Column1), TOTUPLE('Column2', Column2), TOTUPLE('Column3', Column3)) as toPivot; 
pivoted_1 = foreach bagged generate Id, FLATTEN(toPivot) as t_value; 
pivoted = foreach pivoted_1 generate Id, FLATTEN(t_value); 
dump pivoted; 

Bu komut dosyasını çalıştırmak aşağıdaki sonuçlar beni:

(1,Column1,11) 
(1,Column2,12) 
(1,Column3,13) 
(2,Column1,21) 
(2,Column2,22) 
(2,Column3,23) 
(3,Column1,31) 
(3,Column2,32) 
(3,Column3,33) 
3

Ben opsiyonel (NULL) veri

nasıl işleneceğini göstermek için id 1 den Col3 kaldırıldı

Kimliği Adı Değer 1 Sütun1 Row11 1 Sütun2 Row12 2 Column1 Row21 2 Sütun2 Row22 2 Sütun3 Row23

--pigscript.pig

data1  = load 'data.txt' using PigStorage() as (id:int, key:chararray, value:chararray); 
grped  = group data1 by id; 
pvt   = foreach grped { 
    col1  = filter data1 by key =='Column1'; 
    col2  =filter data1 by key =='Column2'; 
    col3  =filter data1 by key =='Column3'; 
    generate flatten(group) as id, 
     flatten(col1.value) as col1, 
     flatten(col2.value) as col2, 
     flatten((IsEmpty(col3.value) ? {('NULL')} : col3.value)) as col3; --HANDLE NULL 
}; 
dump pvt; 

Sonuçlar:

(1, Row11, Row12 NULL)

(2, Row21, Row22, Row23)