Pig 的 COGROUP 运算符如何工作?

Posted

技术标签:

【中文标题】Pig 的 COGROUP 运算符如何工作?【英文标题】:How Pig's COGROUP operator works? 【发布时间】:2015-01-04 19:18:20 【问题描述】:

COGROUP 运算符在这里如何工作? 我们如何以及为什么在最后两行输出中得到空包(没有网站详细解释 COGROUP 中的数据排列)?

A = load 'student' as (name:chararray, age:int, gpa:float);
B = load 'student' as (name:chararray, age:int, gpa:float);
dump B;
(joe,18,2.5)
(sam,,3.0)
(bob,,3.5)

X = cogroup A by age, B by age;
dump X;
(18,(joe,18,2.5),(joe,18,2.5))
(,(sam,,3.0),(bob,,3.5),)
(,,(sam,,3.0),(bob,,3.5))

【问题讨论】:

这是您使用的实际数据集和代码吗?如果没有请提供样品 这是取自 [pig.apache.org/docs/r0.13.0/basic.html] 的实际示例 为什么会有Hive标签? 【参考方案1】:

权威指南中有一个非常清楚的例子。我希望下面的 sn-p 可以帮助你理解 cogroup 的概念。

咕噜声>转储 A;

(2,领带) (4,外套) (3,帽子) (1,围巾)

咕噜声> DUMP B;

(乔,2) (汉克,4) (阿里,0) (夏娃,3) (汉克,2)

grunt> D = COGROUP A BY $0, BY $1;

咕噜声> DUMP D;

(0,,(Ali,0))

(1,(1,围巾),)

(2,(2,Tie),(Joe,2),(Hank,2))

(3,(3,Hat),(Eve,3))

(4,(4,Coat),(Hank,4))

COGROUP 为每个唯一的分组键生成一个元组。每个元组的第一个字段 是键,其余字段是来自具有匹配项的关系的元组包 钥匙。第一个包包含来自关系 A 的具有相同键的匹配元组。 类似地,第二个包包含来自关系 B 的匹配元组,它们具有相同的 键。

如果对于一个特定的键,一个关系没有匹配的键,那么这个关系的包是 空。 例如,由于没有人买过围巾(ID 为 1),所以第二个包在 该行的元组为空。这是一个外连接的例子,它是默认的 输入 COGROUP。

【讨论】:

根据规则,如果对于特定键,关系没有匹配键,则该关系的包为空,在我的情况下,关系 A, (sam,,3.0) 第二个字段有空字段,在关系 B 中有等效的空字段。所以输出应该像 (,(sam,,3.0),(bob,, 3.5),(sam,,3.0),(bob,,3.5)),但是为什么我们得到 (,(sam,,3.0),(bob,,3.5) ,).

以上是关于Pig 的 COGROUP 运算符如何工作?的主要内容,如果未能解决你的问题,请参考以下文章

PIG 中的 GROUP 和 COGROUP 有啥区别?

在 Pig 中出现错误为“错误编译运算符 POLocalRearrange”

Pig 比较运算符在 GENERATE 中不起作用

Pig:将 FOREACH 运算符应用于包中的每个元素

Apache Pig:组运算符和变量模式

Pig关系型运算符例子