我需要在 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/

10-10 13:37