Pig方法配对数据集中的数据字段

bet*_*oys 5 hadoop apache-pig

我是Pig的新手并尝试正确实现一种常见的算法,我需要在一组记录中配对每个匹配的记录.为了将问题提炼成最简单的形式,并避免讨论一些特定于业务的敏感性,这里有一个模拟问题:

假设我有一个代表大学课程的数据集和参加他们的学生:

Philosophy,John
English,Mary
English,Sue
History,Jack
Philosophy,David
English,Mark
English,Larry
Run Code Online (Sandbox Code Playgroud)

我想把同一班级的学生之间的每个关联配对; 所以输出将包括这个,显示四个"英语"行爆炸成六个关联:

Philosphy   John,David
English    Mary,Sue
English    Mary,Mark
English    Mary,Larry
English    Sue,Mark
English    Sue,Larry
English    Mark,Larry
Run Code Online (Sandbox Code Playgroud)

本页:http://ofps.oreilly.com/titles/9781449302641/advanced_pig_latin.html是指使用flatten()来影响交叉产品.我已经尝试了几种方法并对此进行了广泛的研究,并且会发布我的尝试,但说实话,我正在喋喋不休,我认为这只会让读者感到困惑而不会提供任何价值.但这是样板:

s = load 'classes' using PigStorage(',') as (class:chararray, student:chararray);
grp = group s by class;
...
Run Code Online (Sandbox Code Playgroud)

(我相信我面临的问题与需要多个行李的扁平化有关,而不是多个行业,我无法弄清楚如何让我的团队生成多个行李......)

谢谢你的帮助!

Lor*_*dig 6

您可以使用UnorderedPairs从LinkedIn的UDF Datafu项目.从此处下载软件包并发布以下内容(在Pig v0.10.0上测试):

register '/home/user/datafu/dist/datafu-0.0.4.jar'
define UnorderedPairs datafu.pig.bags.UnorderedPairs();
A = load 'classes' using PigStorage(',') as (class:chararray, student:chararray);
B = GROUP A BY class;
C = FOREACH B GENERATE group, FLATTEN(UnorderedPairs(A.student));
Run Code Online (Sandbox Code Playgroud)

当进一步展平结果时:

D = FOREACH C generate FLATTEN($0) as (class:chararray), 
      FLATTEN($1) as (student1:chararray), FLATTEN($2) as (student2:chararray);
Run Code Online (Sandbox Code Playgroud)

你最终会得到想要的结果:

dump D;

(English,Mary,Sue)
(English,Mary,Mark)
(English,Mary,Larry)
(English,Sue,Mark)
(English,Sue,Larry)
(English,Mark,Larry)
(Philosophy,John,David)
Run Code Online (Sandbox Code Playgroud)