我有四列A,B,C,D 其中列D的所有值都相同(例如:'d') 数据是
A,B,C,D
1,b,1,d
2,x,3,d
3,y,3,d
我想找到C上的中位数并存储在Median
列下。其余的A,B,C,D应该和往常一样。
1)在D上进行组
2)使用apache fu包(http://datafu.incubator.apache.org/docs/datafu/getting-started.html)在C上找到中位数。
我想要
A,B,C,D,Median
1,b,1,d,3
2,x,3,d,3
3,y,3,d,3
但是我得到了
{A: {(A: long)},B: {(B: chararray)},C: {(C: long)},D: {(B: chararray)},Median: (quantile_0_5: double),}
我希望删除所有包,并将其用作元组。 有人可以建议获得所需的输出吗?
答案 0 :(得分:0)
看看BagToTuple UDF。它需要一个Bag并将其转换为元组,因此您将不得不为每个行李(每个列)调用一次。这个输出会为每个列提供一个元组,而不是整行的元组,我想这不是你想要的,所以展平BagToTuple
的输出:
input_data = load 'input' using PigStorage(',') as (A: bag{(a: long)}, B: bag{(b: chararray)}, C: bag{(c: long)}, D: bag{(d: chararray)}, Median: bag{(median: double)});
dump input_data;
({(1)},{(b)},{(1)},{(d)},{(3.0)})
({(2)},{(x)},{(3)},{(d)},{(3.0)})
({(3)},{(y)},{(3)},{(d)},{(3.0)})
output = foreach input_data generate FLATTEN(BagToTuple($0)),
FLATTEN(BagToTuple($1)),
FLATTEN(BagToTuple($2)),
FLATTEN(BagToTuple($3)),
FLATTEN(BagToTuple($4));
dump output;
(1,b,1,d,3.0)
(2,x,3,d,3.0)
(3,y,3,d,3.0)