1

我在 HDFS 上有大量输入,我想使用 Pig 来计算几个独特的指标。为了帮助更容易地解释问题,我假设输入文件具有以下架构:

userId:chararray, dimensionA_key:chararray, dimensionB_key:chararray, dimensionC_key:chararray, activity:chararray, ...

每条记录代表该 userId 执行的一项活动。

根据活动字段中的值,此活动记录将映射到 1 个或多个类别。总共大约有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 ...;

谢谢。TE

4

1 回答 1

0

如果我了解您要查找的内容,则可能是 CUBE 操作允许按多种组合进行分组-在 Pig 0.11 中可用。

如果您不能使用 Pig 0.11,您可以尝试按每个排列组合并 UNION 分组结果。

于 2013-05-06T09:00:39.763 回答