我是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)
(我相信我面临的问题与需要多个行李的扁平化有关,而不是多个行业,我无法弄清楚如何让我的团队生成多个行李......)
谢谢你的帮助!
您可以使用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)
| 归档时间: |
|
| 查看次数: |
1914 次 |
| 最近记录: |