问题 加入PIG中的COGROUP


当我在猪中使用COGROUP代替JOIN时,是否有任何优势(wrt性能/没有地图减少)?

http://developer.yahoo.com/hadoop/tutorial/module6.html 谈论他们产生的产出类型的差异。但是,忽略“输出模式”,性能是否存在显着差异?


2778
2017-09-21 07:23


起源



答案:


没有重大的性能差异。我说这个的原因是它们最终都是一个MapReduce作业,它将相同的数据发送到Reducer。两者都需要向前发送所有记录,密钥是外键。如果有的话 COGROUP 可能会快一点,因为它不会在击中时使用笛卡尔积,并将它们保存在单独的袋中。

如果您的某个数据集较小,则可以使用名为的连接选项 “复制加入”。这将在所有map任务中分配第二个数据集并将其加载到主内存中。这样,它可以在映射器中完成整个连接,而不需要reducer。根据我的经验,这是非常值得的,因为连接和组合的瓶颈是将整个数据集拖放到reducer。你不能这样做 COGROUP, 据我所知。


12
2017-09-21 13:13



在内部,join和cogroup在Pig中是相同的(并且连接中没有笛卡尔连接,不确定你的意思)。只有最终结果的格式会根据您使用的关键字而改变。尝试对连接结果进行“描述” - 您将在解释计划中看到COGROUP运算符。 - SquareCog
我对笛卡尔积的意思是,如果外键上有多个匹配项,您将获得更多记录。例如,如果在一个数据集中有3x“abcde”,然后在第二个数据集中有4x“abcde”,则它输出12x记录,因为它匹配每个数据集。同时,在COGROUP中,它将关系分开。 - Donald Miner


答案:


没有重大的性能差异。我说这个的原因是它们最终都是一个MapReduce作业,它将相同的数据发送到Reducer。两者都需要向前发送所有记录,密钥是外键。如果有的话 COGROUP 可能会快一点,因为它不会在击中时使用笛卡尔积,并将它们保存在单独的袋中。

如果您的某个数据集较小,则可以使用名为的连接选项 “复制加入”。这将在所有map任务中分配第二个数据集并将其加载到主内存中。这样,它可以在映射器中完成整个连接,而不需要reducer。根据我的经验,这是非常值得的,因为连接和组合的瓶颈是将整个数据集拖放到reducer。你不能这样做 COGROUP, 据我所知。


12
2017-09-21 13:13



在内部,join和cogroup在Pig中是相同的(并且连接中没有笛卡尔连接,不确定你的意思)。只有最终结果的格式会根据您使用的关键字而改变。尝试对连接结果进行“描述” - 您将在解释计划中看到COGROUP运算符。 - SquareCog
我对笛卡尔积的意思是,如果外键上有多个匹配项,您将获得更多记录。例如,如果在一个数据集中有3x“abcde”,然后在第二个数据集中有4x“abcde”,则它输出12x记录,因为它匹配每个数据集。同时,在COGROUP中,它将关系分开。 - Donald Miner