pig unique对一个大输入的多个子集进行计数

rbl8hiat  于 2021-06-24  发布在  Pig
关注(0)|答案(1)|浏览(303)

我在hdfs上有大量的输入,我想用pig来计算几个独特的度量。为了更容易地解释问题,我假设输入文件具有以下模式:
userid:chararray,尺寸A_key:chararray,尺寸B_key:chararray,尺寸C_key:chararray, activity:chararray, ...
每个记录表示由该userid执行的活动。
根据“活动”字段中的值,此活动记录将Map到一个或多个类别。总共大约有10个类别。
现在我需要计算每个活动类别的不同维度组合(即a、b、c、a+b、a+c、b+c、a+b+c)的唯一用户数。
进行这种计算的最佳做法是什么?
我试过几种方法。虽然我可以得到我想要的结果,但这需要很长的时间(即几天)。我发现大部分时间都花在Map阶段。看起来,每次脚本试图计算一个唯一计数时,它都会尝试加载巨大的输入文件。有没有办法改善这种行为?
我也尝试了类似于下面的东西,但它似乎达到了单一减速机的内存上限,只是停留在减速机的最后一步。

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。

doinxwow

doinxwow1#

如果我理解你在找什么,可能是cube操作允许通过许多组合进行分组-在pig0.11中提供。
如果不能使用pig0.11,可以尝试按每个排列进行分组,并合并分组的结果。

相关问题