在清管器中枢轴

ndh0cuux  于 2021-06-24  发布在  Pig
关注(0)|答案(2)|浏览(268)

这与apache pig的pivot表中的问题有关。输入数据如下

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。

nqwrtyyt

nqwrtyyt1#

不使用自定义项的最简单方法是按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,将bag{name,value}转换为map[],而不是使用列名作为键(例如vals#'column1')来获取值。

mwngjboj

mwngjboj2#

不确定pig,但在spark中,您可以使用一行命令来完成此操作

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

相关问题