2012-06-26 3 views
5

Интересно, можно ли поворачивать стол за один проход в Apache Pig.Сводный стол с Apache Pig

Вход:

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 

Реальные данные десятки столбцов.

Я могу сделать это с awk за один проход, а затем запустить его с помощью Hadoop Streaming. Но большинством моего кода является Apache Pig, поэтому я задаюсь вопросом, возможно ли это сделать в Pig эффективно.

ответ

7

Вы можете сделать это двумя способами: 1. Напишите UDF, который возвращает мешок с кортежами. Это будет наиболее гибкое решение, но требует Java-кода; 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

Я удалил col3 с идентификатором 1, чтобы показать, как обрабатывать дополнительные данные

(NULL)

Id Имя Значение 1 Столбец1 Row11 1 Столбец2 Row12 2 Столбец1 Row21 2 Столбец2 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, NULL)

(2, Row21, Row22, Row23)