【问题标题】:Pig: How to flatten & re-join bags within bags猪:如何在袋子内压平和重新连接袋子
【发布时间】:2013-06-06 00:08:54
【问题描述】:

我有一个示例,我们正在尝试执行看似简单的连接:

A = load 'data6' as ( item:chararray, d:int, things:bag{(thing:chararray, d1:int, values:bag{(v:chararray)})} );
B = load 'data7' as ( v:chararray, r:chararray );

    grunt> cat data1
    'item1' 111     { ('thing1', 222, {('value1'),('value2')}) }
    grunt> cat data2
    'value1'        'result1'
    'value2'        'result2'

我们想将data2'result1''result2' 数据加入到data1 的条目中,在明显的value 字段上。

我们设法将其展平:

A = load 'data6' as ( item:chararray, d:int, things:bag{(thing:chararray, d1:int, values:bag{(v:chararray)})} );
B = load 'data7' as ( v:chararray, r:chararray );
F1 = foreach A generate item, d, flatten(things);
F2 = foreach F1 generate item..d1, flatten(values);

然后我们加入了第二个数据集:

J = join F2 by v, B by v
J1 = foreach J generate item as item, d as d, thing as thing, d1 as d1, F2::things::values::v as v, r as r;         --Remove duplicate field & clean up naming

    dump J1
    ('item1',111,'thing1',222,'value1','result1')
    ('item1',111,'thing1',222,'value2','result2')

现在我们需要为每个项目调用一次 UDF 函数,因此我们需要重新组合这 2 个级别的包。每个项目有 0 个或多个事物,每个事物有 0 个或多个值,这些值现在可能有结果,也可能没有结果。

我们如何返回:

 ('item1', 111, { 'thing1', 222, { ('value1, 'result1'), ('value2', 'result2') }

我在分组和重新加入方面的所有尝试都变得复杂,未能产生正确的结果,并且在 4 个以上的 mapreduce 作业中运行,而 Hadoop 中应该是 1 个 mapreduce 作业。

【问题讨论】:

    标签: hadoop apache-pig


    【解决方案1】:

    下面的代码可能会起作用,R2是最终结果:

    group_by_item_d_thing_d1 = group J1 by item, d, thing, d1;
    R1 = foreach group_by_item_d_thing_d1 generate group.item, group.d, group.thing, group.d1, J1;
    group_by_item_d = group R1 by item, d;
    R2 = foreach group_by_item_d generate group.item, group.d, R1;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-27
      • 1970-01-01
      • 2012-05-11
      • 1970-01-01
      • 2019-12-01
      • 2012-05-22
      • 2018-10-16
      相关资源
      最近更新 更多