Сводная таблица с 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.


person PokerIncome.com    schedule 26.06.2012    source источник


Ответы (2)


Вы можете сделать это двумя способами: 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)
person alexeipab    schedule 27.06.2012

Я удалил col3 из идентификатора 1, чтобы показать, как обрабатывать необязательные (NULL) данные.

Идентификатор Имя Значение 1 Столбец 1 Строка 11 1 Столбец 2 Строка 12 2 Столбец 1 Строка 21 2 Столбец 2 Строка 22 2 Столбец 3 Строка 23

--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,Строка11,Строка12,НОЛЬ)

(2, Ряд 21, Ряд 22, Ряд 23)

person Mike Inman    schedule 06.12.2012