我想保持关系的元组计数进行一些计算,什么是最有效的解决方案。目前我接近这样:
G4 = GROUP D ALL;
E = FOREACH G4{
total = COUNT(D);
GENERATE FLATTEN(D),total as total;
};
上面的pig代码片段转换为只有一个reduce的MapReduce作业,这非常慢。
答案 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