我需要在 Pig 中进行非均等连接。我想尝试的第一件事是 CROSS + 过滤器:
together = CROSS A, B;
filtered = FILTER together BY (JOIN PREDICATE);
但是,其中一个关系绝对小到可以放入内存中。这让我想知道 CROSS 是如何在 Pig 中实际实现的。它可以做一个“复制”的 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);
第二种方法会看到任何性能提升吗?
最佳答案
因此,对于具有 2M 记录的大关系和具有 500K 记录的小关系,复制连接要快得多。
然而,两者都太慢了,我最终实现了一个 UDF,它允许一个正常的复制连接,但代价是增加了大关系的大小。
对于不可能做到的情况,似乎使用假 key 的复制连接是可行的方法。
关于hadoop - Pig CROSS 与复制的 JOIN,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25261903/