3

这与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 

请让我知道如何在 Pig 中做到这一点。

4

2 回答 2

2

不使用 UDF 的最简单方法是在 Id 上进行分组,而不是在嵌套的 foreach 中为每个列名选择行,然后在生成中加入它们。见脚本:

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,它将 bag{name, value} 转换为 map[],而不是通过使用列名作为键来获取值(例如 vals#'Column1')。

于 2012-07-21T17:25:24.270 回答
0

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

df.groupBy("Id").pivot("Name").agg(first("Value"))
于 2019-02-15T15:19:51.773 回答