这与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
请告诉我如何在猪身上做到这一点。
答案 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"))