猪CROSS与复制JOIN

时间:2014-08-12 10:21:59

标签: hadoop apache-pig

我需要在Pig中做一个非等值的。我想要尝试的第一件事是CROSS +过滤器:

    together = CROSS A, B;
    filtered = FILTER together BY (JOIN PREDICATE);

然而,其中一个关系肯定足够小以适应记忆。这让我想知道CROSS实际上是如何实现的。可以做一个复制的' CROSS?

如果没有,我可以这样做:

    small = FOREACH small GENERATE *, 1 AS key:int;
    large = FOREACH large GENERATE *, 1 AS key:int;
    together = JOIN large BY key, small BY key USING 'replicated';
    filtered = FILTER together BY (JOIN PREDICATE);

第二种方法会看到任何性能提升吗?

2 个答案:

答案 0 :(得分:2)

因此,对于2M记录的大关系和500K记录的小关系,复制的连接速度要快得多。

但是,两者都太慢了,我最终实现了一个允许正常复制连接的UDF,代价是稍微增加大关系的大小。

对于不可能的情况,似乎可以通过虚假密钥进行复制连接。

答案 1 :(得分:1)

这是一个好点!确实是个好问题。

在引擎盖下,CROSS被翻译为GFCross和COGROUP,如here所述。 请注意,Pig的哲学说猪是一种家养动物'因此对优化性能没有太大作用。相反,用户应该更改行为以获得最佳的数据性能。

我认为(不是100%肯定)你的替代解决方案使用虚拟列上的JOIN实现你自己的CROSS应该会给你更好的性能。

无论如何,您可以进行几次测试以比较性能并自行获得结果!