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)