使用 pig 生成最大数量

Posted

技术标签:

【中文标题】使用 pig 生成最大数量【英文标题】:generating maximum number using pig 【发布时间】:2014-02-21 02:26:32 【问题描述】:

我试图为以下数据找到 generate year , MAX(number) ,它给了我错误提示

错误 1045:无法将 org.apache.pig.builtin.MAX 的匹配函数推断为多个匹配或都不匹配。请使用显式转换。

我使用了命令

loadfirstoutput = load '/outt/part-r-00000' as (year:chararray, number:chararray); 
foreach2 = foreach loadfirstoutput generate year, MAX(number);  
dump foreach2;

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

"   8
A"  6
"0" 4004
Ng" 1
1)" 1
Co" 5
/i>"    12
#4)"    1
&amp    2
21)"    1
22)"    2
38)"    1
80)"    1
Now"    1
Son"    1
"Unk"   1
Budd"   1
Food"   1
Ginn"   1
Hate"   1
Jax)"   1
Lang"   1
More"   1
Ross"   1
Sans"   1
Sign"   2
Sons"   1
Stan"   1
"1378"  1
"1806"  1
"1900"  2
"1901"  5
"1902"  2
"1904"  1
"1906"  1
"1908"  1
"1909"  2
"1910"  1
"1911"  14
"1914"  1
"1917"  1
"1920"  29
"1921"  2
"1923"  10
"1924"  2

【问题讨论】:

pig.apache.org/docs/r0.11.0/func.html#max 【参考方案1】:

很难判断您的数据发生了什么。但假设它是模式所暗示的,你需要先分组。

loadfirstoutput = load '/outt/part-r-00000' as (name:chararray, year:chararray, number:chararray); 
A = GROUP  loadfirstoutput ALL;
B = FOREACH A GENERATE MAX(loadfirstoutput.number);  
dump B;

这将为您提供最大“数量”

如果你想要每年的最大数量

loadfirstoutput = load '/outt/part-r-00000' as (name:chararray, year:chararray, number:chararray); 
    A = GROUP  loadfirstoutput BY year;
    B = FOREACH A GENERATE MAX(loadfirstoutput.number);  
    dump B;

【讨论】:

【参考方案2】:

这并没有回答问题,但是在MAX中混合不同类型的另一种情况发生了同样的错误,如下所示:

FOREACH fltrd GENERATE ids, MAX(TOBAG(suu, 1)) AS uu;

suu 是一个长字段。

我必须通过像这样将 L 附加到 1 来将 int 1 转换为 long 1:

FOREACH fltrd GENERATE ids, MAX(TOBAG(suu, 1L)) AS uu;

【讨论】:

以上是关于使用 pig 生成最大数量的主要内容,如果未能解决你的问题,请参考以下文章

使用随机变量来定义生成的最大数量

聚合的 Pig Latin 逻辑测试

PIG 使用不同的负载变量生成数据

Apple Developer 帐户错误:生成的最大证书数量(开发)

Pig 在空集中生成结果

Pig - 生成 JSON 文件的结构格式