我对HDFS有很大的投入,我想用Pig来计算几个独特的指标。为了帮助更轻松地解释问题,我假设输入文件具有以下模式:
userId:chararray,dimensionA_key:chararray,dimensionB_key:chararray,dimensionC_key:chararray,activity:chararray,...
每条记录代表该userId执行的活动。
根据活动字段中的值,此活动记录将映射到一个或多个类别。总共大约有10个类别。
现在我需要为每个活动类别计算不同维度组合(即A,B,C,A + B,A + C,B + C,A + B + C)的唯一身份用户数。
执行此类计算的最佳做法是什么?
我尝试了几种方法。虽然我可以得到我想要的结果,但需要很长时间(即几天)。我发现大部分时间花在地图阶段。看起来每次尝试计算一个唯一计数时,脚本都会尝试加载巨大的输入文件。有没有办法改善这种行为?
我也尝试了类似于下面的内容,但看起来它达到了单个减速器的内存上限而且只是停留在最后一个减速器步骤。
source = load ... as (userId:chararray, dimensionA_key:chararray, dimensionB_key:chararray, dimensionC_key:chararray, activity:chararray, ...);
a = group source by (dimensionA_key, dimensionB_key);
b = foreach a {
userId1 = udf.newUserIdForCategory1(userId, activity);
-- this udf returns the original user id if the activity should be mapped to Category1 and None otherwise
userId2 = udf.newUserIdForCategory2(userId, activity);
userId3 = udf.newUserIdForCategory3(userId, activity);
...
userId10 = udf.newUserIdForCategory10(userId, activity);
generate FLATTEN(group), COUNT(userId1), COUNT(userId2), COUNT(userId3), ..., COUNT(userId10);
}
store b ...;
感谢。 T.E。
答案 0 :(得分:0)
如果我理解你在寻找什么,可能是CUBE操作允许通过许多组合进行分组 - 在Pig 0.11中可用。
如果你不能使用Pig 0.11,你可以尝试按每个排列组合和UNION分组结果。