如何在猪的关系中附加一个常量值

时间:2013-11-18 11:04:16

标签: hadoop apache-pig

我想保持关系的元组计数进行一些计算,什么是最有效的解决方案。目前我接近这样:

G4 = GROUP D ALL;
E = FOREACH G4{
    total  = COUNT(D);
    GENERATE FLATTEN(D),total as total;     
};

上面的pig代码片段转换为只有一个reduce的MapReduce作业,这非常慢。

2 个答案:

答案 0 :(得分:2)

这需要很长时间,因为您必须将所有数据发送到reducer,然后将其全部重新写回磁盘。这是由FLATTEN引起的。 COUNT实际上非常有效,因为Pig使用组合器来处理中间结果。因此,您只需计算计数,然后使用虚拟值有效JOIN

G4 = GROUP D ALL;
E = FOREACH G4 GENERATE COUNT(D) AS ct;
F = JOIN D BY 1, E BY 1 USING 'replicated';

现在,您的关系F包含D中的所有元组,以及一个名为ct的字段,即D中元组的总数。通过USING 'replicated',您将E放入内存,因此您无需将数据放入缩减阶段。

计算E仍然需要1个reducer,但它会很快。

答案 1 :(得分:1)

您确定要将COUNT放在数据架构中吗? 如果你想在以后的语句中使用它,那么你可以使用'cast relations to scalars'功能。 一个很好的例子是: https://issues.apache.org/jira/browse/PIG-1434