2015-05-26 63 views
0

我有四个列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包发现C上的中位数(http://datafu.incubator.apache.org/docs/datafu/getting-started.html)。

我想

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。它需要一个袋子并将其转换为一个Tuple,所以您将不得不为每个行李(每个列)调用一次。这样做的输出会给你一个元组每列的,而不是对整个行,我想这不是你想要的一个元组,所以扁平化的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)