我需要在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);
第二种方法会看到任何性能提升吗?
答案 0 :(得分:2)
因此,对于2M记录的大关系和500K记录的小关系,复制的连接速度要快得多。
但是,两者都太慢了,我最终实现了一个允许正常复制连接的UDF,代价是稍微增加大关系的大小。
对于不可能的情况,似乎可以通过虚假密钥进行复制连接。
答案 1 :(得分:1)
这是一个好点!确实是个好问题。
在引擎盖下,CROSS被翻译为GFCross和COGROUP,如here所述。 请注意,Pig的哲学说猪是一种家养动物'因此对优化性能没有太大作用。相反,用户应该更改行为以获得最佳的数据性能。
我认为(不是100%肯定)你的替代解决方案使用虚拟列上的JOIN实现你自己的CROSS应该会给你更好的性能。
无论如何,您可以进行几次测试以比较性能并自行获得结果!