【问题标题】:bags to tuples in pig包到猪的元组
【发布时间】:2015-05-26 11:51:00
【问题描述】:

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

我希望删除所有这些包并用作元组。 有人可以提出一些建议以获得所需的输出吗?

【问题讨论】:

  • 你能分享你的代码吗?

标签: apache-pig etl


【解决方案1】:

看看BagToTuple UDF。它需要一个 Bag 并将其转换为 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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多