Hadoop Pig中的条件和

Hadoop Pig中的条件和,hadoop,apache-pig,Hadoop,Apache Pig,我使用三元运算符有条件地在SUM()操作中包含值。下面是我是怎么做的 GROUPED = GROUP ALL_MERGED BY (fld1, fld2, fld3); REPORT_DATA = FOREACH GROUPED { GENERATE group, SUM(GROUPED.fld4 == 'S' ? GROUPED.fld5 : 0) AS sum1, SUM(G

我使用三元运算符有条件地在
SUM()
操作中包含值。下面是我是怎么做的

GROUPED = GROUP ALL_MERGED BY (fld1, fld2, fld3);

REPORT_DATA = FOREACH GROUPED
              {     GENERATE group,
                    SUM(GROUPED.fld4 == 'S' ? GROUPED.fld5 : 0) AS sum1,
                    SUM(GROUPED.fld4 == 'S' ? GROUPED.fld5 : (GROUPED.fld5 * -1)) AS sum2;
               }
ALL\u MERGED
的架构为

{ALL_MERGED: {fld1:chararray, fld2:chararray, fld3:chararray, fld4:chararray: fld5:int}}
执行此操作时,会出现以下错误:

ERROR org.apache.pig.tools.grunt.Grunt - ERROR 1000: Error during parsing. Invalid alias: SUM in {group: (fld1:chararray, fld2:chararray, fld3:chararray), ALL_MERGED: {fld1:chararray, fld2:chararray, fld3:chararray, fld4:chararray: fld5:int}}

我做错了什么?

SUM
是一个以包为输入的自定义项。你所做的有很多问题,我想这会帮助你复习一本关于Pig的好参考书。我推荐,网上免费提供。首先,
GROUPED
有两个字段:一个名为
group
的元组和一个名为
ALL\u MERGED
的包,这就是错误消息试图告诉您的内容。(我之所以说“尝试”,是因为Pig的错误消息通常非常隐晦。)

此外,您不能像希望的那样将表达式传递给UDF。相反,您必须
生成这些字段,然后传递它们。试试这个:

ALL_MERGED_2 =
    FOREACH ALL_MERGED
    GENERATE
        fld1 .. fld5,
        ((fld4 == 'S') ? fld5 : 0) AS sum_me1,
        ((fld4 == 'S') ? fld5 : fld5*-1) AS sum_me2;

GROUPED = GROUP ALL_MERGED_2 BY (fld1, fld2, fld3);
DATA =
    FOREACH GROUPED
    GENERATE
        group,
        SUM(ALL_MERGED_2.sum_me1) AS sum1,
        SUM(ALL_MERGED_2.sum_me2) AS sum2;