Hadoop Pig 10.0-将元组分组,并在foreach中合并包

Hadoop Pig 10.0-将元组分组,并在foreach中合并包,hadoop,apache-pig,Hadoop,Apache Pig,我正在使用pig10.0。我想把包合并到一个文件夹里。假设我有以下访客别名: (a, b, {1, 2, 3, 4}), (a, d, {1, 3, 6}), (a, e, {7}), (z, b, {1, 2, 3}) 我想将第一个字段上的元组分组,并将这些包与一组语义合并,以获得以下元组: ({1, 2, 3, 4, 6, 7}, a, 6) ({1, 2, 3}, z, 3) 第一个字段是具有一组语义的行李的并集。元组的第二个字段是组字段。第三个字段是行李中物品的编号 我尝试了以下

我正在使用
pig10.0
。我想把包合并到一个文件夹里。假设我有以下
访客
别名:

(a, b, {1, 2, 3, 4}),
(a, d, {1, 3, 6}),
(a, e, {7}),
(z, b, {1, 2, 3})
我想将第一个字段上的元组分组,并将这些包与一组语义合并,以获得以下元组:

({1, 2, 3, 4, 6, 7}, a, 6) 
({1, 2, 3}, z, 3) 
第一个字段是具有一组语义的行李的并集。元组的第二个字段是组字段。第三个字段是行李中物品的编号

我尝试了以下代码的几种变体(将SetUnion替换为Group/Distinct等),但始终未能实现所需的行为:

DEFINE SetUnion        datafu.pig.bags.sets.SetUnion();

grouped = GROUP visitors by (FirstField);
merged = FOREACH grouped {
    VU = SetUnion(visitors.ThirdField);
    GENERATE 
        VU        as Vu,
        group     as FirstField,
        COUNT(VU) as Cnt;
    }
dump merged;

你能解释一下我错在哪里,以及如何实现期望的行为吗

我终于实现了想要的行为。我的解决方案的一个独立示例如下:

数据文件:

a       b       1
a       b       2
a       b       3
a       b       4
a       d       1
a       b       3
a       b       6
a       e       7
z       b       1
z       b       2
z       b       3
代码:

-- Prepare data
in = LOAD 'data' USING PigStorage() 
        AS (One:chararray, Two:chararray, Id:long);

grp = GROUP in by (One, Two);
cnt = FOREACH grp {
        ids = DISTINCT in.Id;
        GENERATE
                ids        as Ids,
                group.One  as One,
                group.Two  as Two,
                COUNT(ids) as Count;
}       

-- Interesting code follows
grp2 = GROUP cnt by One;
cnt2 = FOREACH grp2 {
        ids = FOREACH cnt.Ids generate FLATTEN($0);
        GENERATE
                ids  as Ids,
                group      as One,
                COUNT(ids) as Count;
}               

describe cnt2;
dump grp2;
dump cnt2;
描述:

Cnt: {Ids: {(Id: long)},One: chararray,Two: chararray,Count: long}
grp2:

cnt2:

由于代码使用嵌套在FOREACH中的FOREACH,因此需要Pig>10.0


我会让这个问题在几天内没有解决,因为可能存在一个更干净的解决方案。

找到了一个更简单的解决方案

当前输入=使用PigStorage()加载“/idn/home/ksing143/tuple\u related\u data/tough\u grouping.txt”(col1:chararray,col2:chararray,col3:int)

/*但我们不需要第2列。因此,应避免混淆*/

相关_输入=每个当前_输入生成col1、col3

相关_distinct=不同的相关_输入

相关分组=由col1区分的组相关分组

/*这将给*/

(a,{(a,1)、(a,2)、(a,3)、(a,4)、(a,6)、(a,7)})

(z,{(z,1)、(z,2)、(z,3)})

Relative_grouped_advance=每个相关_grouped生成(relative_distinct.col3)作为col3,组,计数(relative_distinct.col3)作为COUNT_val

/*这将产生预期的结果*/

({(1)、(2)、(3)、(4)、(6)、(7)},a,6)

({(1)、(2)、(3)},z,3)

(a,{({(1),(2),(3),(4),(6)},a,b,5),({(1)},a,d,1),({(7)},a,e,1)})
(z,{({(1),(2),(3)},z,b,3)})
({(1),(2),(3),(4),(6),(1),(7)},a,7)
({(1),(2),(3)},z,3)