Apache pig 如何使用ApachePig查找两个包中常见项目的子集?

Apache pig 如何使用ApachePig查找两个包中常见项目的子集?,apache-pig,Apache Pig,我想使用ApachePig在两个列表中查找公共项(=相交)的子集 在SQL中,公认的方法是使用内部联接,例如: C = SELECT * FROM A INNER JOIN B ON A.name=B.name; 然而,对于Pig中的所有高级选项(如DIFF、DataFu的SetIntersect),我不确定这是否是最好的方法(就性能、MapReduce范例等而言) 因此,以下两种选择是可行的——但最佳实践是什么 备选方案A: grouped = COGROUP A BY name, B by

我想使用ApachePig在两个列表中查找公共项(=相交)的子集

在SQL中,公认的方法是使用内部联接,例如:

C = SELECT * FROM A INNER JOIN B ON A.name=B.name;
然而,对于Pig中的所有高级选项(如DIFF、DataFu的SetIntersect),我不确定这是否是最好的方法(就性能、MapReduce范例等而言)

因此,以下两种选择是可行的——但最佳实践是什么

备选方案A:

grouped = COGROUP A BY name, B by name;
common = FOREACH grouped {
A1 = ORDER A BY name
B1 = ORDER B BY name
GENERATE SetIntersect(A1,B1);};
备选案文B:

grouped = COGROUP A BY name, B by name;
common = FOREACH grouped {
GENERATE SetIntersect(A.name,B.name);};

任何帮助都将不胜感激。

如果您的关系具有相同的模式,或者您只对一个字段(例如名称)感兴趣,我可以建议一种方法,对于非常大的文件,它将比SQL样式的联接快得多

a = LOAD 'Afile.txt' using PigStorage() as (name:chararray);
b = LOAD 'Bfile.txt' using PigStorage() as (name:chararray);
a_counters = foreach a generate *, 1 as from_a, 0 as from_b;
b_counters = foreach b generate *, 0 as from_a, 1 as from_b;
united = union a_counters, b_counters;
res = foreach (group united by name) generate group, SUM(united.from_a) as from_a, SUM(united.from_b) as from_b;
res = filter res by from_a >=1 and from_b>=1;
res现在只包含两个文件中的名称。这将生成一个MR作业。对于我的大文件(数十亿行,几十个字段),这种方法只需几分钟就可以完成,而使用JOIN时需要数小时


这种方法将为每个记录创建一个指示符,指示它来自哪个文件。然后将这两个文件“连接”起来,并将每个名称的指示符相加。仅存在于文件A中的名称的from_A>=1和from_b==0。仅存在于文件B中的名称的from_B>=1和from_a==0。这两个文件中存在的名称的from\u a>=1和from\u b>=1。

最佳做法取决于数据的大小。通常避免排序。为什么不在Pig中只执行内部联接?如果我理解正确,每个内部联接将启动一个新的MapReduce过程-这可能会很昂贵(特别是如果需要多个这样的检查)。所以我想知道是否有比SQL风格的连接更好的方法来实现这一点。