Pig Latin:组中的所有对 - 嵌套的foreach带有十字和过滤器

时间:2014-11-05 23:23:17

标签: apache-pig

我有一些分组数据:

glu: (
    group:tuple(foo:bytearray, bar:chararray),
    bam: bag {
        :tuple(foo:bytearray, bar:chararray, pom:Long)
    }
)

我想要的是做一个嵌套的交叉产品来获取所有pom对,并且过滤器只能减少到第一个pom小于第二个pom的对。结束这样的事情:

glu: (
    group:tuple(foo:bytearray, bar:chararray),
    bam: bag {
        :tuple(foo:bytearray, bar:chararray, pom1:Long, pom2:Long)
    }
)

类似的东西:

glupairs = FOREACH glu {
    pairs = CROSS bam, bam;
    filtered = FILTER pairs BY (bam1 != bam2) AND (bam1 < bam2);
    GENERATE group, filtered;
};

当然,这不起作用。有没有办法做到这一点?我可以采取与自身关系的交叉产品吗?如何在之后选择字段(进行过滤)?

提前致谢。

1 个答案:

答案 0 :(得分:1)

我通过这样做来解决这个问题:

glupairs = FOREACH glu {
    copied = FOREACH bam GENERATE -(-pom); -- Deals with the self cross bug
    pairs = CROSS bam, copied;
    filtered = FILTER pairs BY (bam.pom != copied.pom) AND (bam.pom < copied.pom);
    GENERATE group, filtered;
};