pig-max在分组后不工作

8ehkhllq  于 2021-05-30  发布在  Hadoop
关注(0)|答案(3)|浏览(347)

我和你一起工作 Pig 0.12.1 以及 Map-R . 我试图找到最大的一个领域后,分组的关系在其他一些领域。请参阅下面的pig脚本和注解中的关系结构-

r1 = foreach SomeRelation generate flatten(group) as (c1 , c2);
-- r1: {c1: biginteger,c2: biginteger}
r2 = group r1 by c1;
-- r2: {group: chararray,r1: {(c1: chararray,c2: biginteger)}}

DUMP r2;
/* output -
1234|{(1234,9876)}
2345|{(2345,8765)}
3456|{(3456,7654)}
4567|{(4567,6543)}

* /

r3 = foreach r2 generate group as c1, MAX(r1.c2) as c2;

我得到以下错误

Could not infer the matching function for org.apache.pig.builtin.MAX as multiple or none of them fit. Please use an explicit cast.

脚本说明-
我将某个关系的群展平成c1,c2,然后在c1上重新分组,生成每个c1群的最大c2。
请建议。

vmdwslir

vmdwslir1#

好吧,问题似乎是pig不允许在biginteger上使用max(或sum等聚合函数)。必须使用long作为数据类型才能工作。参考以下内容-

r1 = foreach SomeRelation generate flatten(group) as (c1 , c2:long);
-- r1: {c1: biginteger,c2: long}

奇怪的是,没有文档像biginteger和bigdecimal那样强调这一点。

slsn1g29

slsn1g292#

我们现在知道问题是max无法处理biginteger。
您应该能够像这样分组并获得最大值,并将结果与订单+限制的组合进行比较:

r1 = FOREACH SomeRelation GENERATE FLATTEN(group) AS (c1, c2);
r3 = FOREACH (group r1 by c1) {
    -- you may want to apply a function on a single column
    -- or compare sort + limit to MAX
    list = ORDER $1 BY c2 DESC;
    list_max = LIMIT list 1;
    GENERATE group AS c1, MAX(r1.c2) AS c2, list_max;
}
dgiusagp

dgiusagp3#

我不确定你是否可以在flatten下使用group关键字。另外,你是否考虑过在将组扁平化之前将其标记化。例如:

load_data = LOAD '/PIG_TESTS_ALL/WordCount' as (line); 
       tokenizing_data = FOREACH load_data generate flatten(TOKENIZE(line)) as word; 
       group_data = GROUP tokenizing_data by word; 
       Result = FOREACH group_data generate group,COUNT(tokenizing_data); 
       dump Result;

这实际上是用于字数计算的,您可以在此基础上根据您想要做的事情找到最大值。

相关问题