2012-06-26 10 views
5

के साथ पिवट तालिका मुझे आश्चर्य है कि अपाचे पिग में एक पास में एक टेबल को पिवॉट करना संभव है।अपाचे पिग

इनपुट:

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

आउटपुट:

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

वास्तविक डेटा स्तंभ के दर्जनों है।

मैं इसे एक पास में अजीब के साथ कर सकता हूं और इसे हडोप स्ट्रीमिंग के साथ चला सकता हूं। लेकिन मेरा अधिकांश कोड अपाचे पिग है इसलिए मुझे आश्चर्य है कि इसे पिग में कुशलता से करना संभव है।

उत्तर

7

आप इसे 2 तरीकों से कर सकते हैं: 1. एक यूडीएफ लिखें जो टुपल्स का एक बैग लौटाता है। यह सबसे लचीला समाधान होगा, लेकिन जावा कोड की आवश्यकता है; 2. राइट इस तरह एक कठोर स्क्रिप्ट:

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; 

इस स्क्रिप्ट चल रहा है मुझे निम्न परिणाम है:

(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

मैं वैकल्पिक (शून्य) डेटा

को संभालने के लिए कैसे दिखाने के लिए आईडी 1 से col3 हटाया

ईद का नाम मूल्य 1 स्तंभ 1 Row11 1 Column2 Row12 2 स्तंभ 1 Row21 2 Column2 Row22 2 स्तम्भ 3 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; 

परिणाम:

(1, Row11, Row12, शून्य)

(2, Row21, Row22, Row23)