旋转猪

时间:2012-07-20 11:53:06

标签: pivot apache-pig

这与Pivot table with Apache Pig中的问题有关。 我有输入数据

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

并想要转动并获得输出

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

请告诉我如何在猪身上做到这一点。

2 个答案:

答案 0 :(得分:2)

在没有UDF的情况下执行此操作的最简单方法是对Id进行分组,然后对每个列名称的嵌套foreach选择行进行分组,然后将它们连接到generate中。见脚本:

inpt = load '~/rows_to_cols.txt' as (Id : chararray, Name : chararray, Value: chararray);
grp = group inpt by Id;
maps = foreach grp {
    col1 = filter inpt by Name == 'Column1';
    col2 = filter inpt by Name == 'Column2';
    col3 = filter inpt by Name == 'Column3';
    generate flatten(group) as Id, flatten(col1.Value) as Column1, flatten(col2.Value)  as Column2, flatten(col3.Value)  as Column3;
};

输出:

(1,Row11,Row12,Row13)
(2,Row21,Row22,Row23)

另一种选择是编写一个将包{name,value}转换为map []的UDF,而不是使用列名作为键来使用get值(例如vals#'Column1')。

答案 1 :(得分:0)

不确定猪,但是在火花中,您可以使用单行命令执行此操作

df.groupBy("Id").pivot("Name").agg(first("Value"))