这与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
请告诉我如何在猪中做到这一点。
在没有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)
另一个选择是编写一个UDF,它将一个包{name,value}转换为map [],而不是使用列名作为键来使用get值(例如,vals#'Column1')。
不确定猪,但在火花中,你可以用一行命令来做到这一点
df.groupBy("Id").pivot("Name").agg(first("Value"))