袋子到猪的元组

时间:2015-05-26 11:51:00

标签: apache-pig etl

我有四列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),}

我希望删除所有包,并将其用作元组。 有人可以建议获得所需的输出吗?

1 个答案:

答案 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)