1

三項演算子を使用して、条件付きで値を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_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}}

ここで何が間違っていますか?

4

1 に答える 1

2

SUMバッグを入力として受け取るUDFです。あなたがしていることには多くの問題があります、そしてそれはあなたがPigに関する良い参考文献をレビューするのに役立つと思います。オンラインで無料で入手できるProgrammingPigをお勧めします。まず、にGROUPEDは2つのフィールドがあります。タプルと呼ばれるものgroupと、と呼ばれるバッグALL_MERGEDです。これは、エラーメッセージが通知しようとしているものです。(Pigのエラーメッセージは非常にわかりにくいことが多いため、「試行中」と言います。)

また、UDFに式を渡すことはできません。代わりに、GENERATEこれらのフィールドに移動し、後でそれらを渡す必要があります。これを試して:

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;
于 2013-01-11T15:35:53.680 に答える