0

Pig UDF を試しています。大文字のような単純なUDFを取得できます。そのため、独自の UDF を作成しようとしていました。3 つの整数を含む入力ファイルの各行を処理したいと考えています。3 つの整数が直角三角形の辺の基準を満たす場合、斜辺が返されます。それ以外の場合は null が返されます。

しかし、次のエラーが発生します - エラー 1066: エイリアス B のイテレータを開けません

これが豚のスクリプトコードです -

-- rat.pig - A Pig script to test right angle triangle
REGISTER /Users/admin/Programming/PigUDF/bin/myudfs/myudfs.jar;
A = LOAD '/Users/admin/Programming/pigdata/triangle.csv' AS (sides: tuple(side_0:int, side_1:int, side_2:int));
B = FILTER A BY (myudfs.RAT(A.sides)!= 0);
DUMP B; 

UDFは次のようなものです

パッケージ myudfs;

import java.io.IOException;
import org.apache.pig.EvalFunc;
import org.apache.pig.data.Tuple;

public class RAT extends EvalFunc<Integer>{
    public Integer exec(Tuple input) throws IOException {
        if (input == null || input.size() == 0) {
            return null;
        }
        try {
            int num_0 = (Integer)input.get(0);
            int num_1 = (Integer)input.get(1);
            int num_2 = (Integer)input.get(2);

            if ((num_0 * num_0) + (num_1 * num_1) == num_2 * num_2) 
                return Integer.valueOf(num_2);
            else if ((num_0 * num_0) + (num_2 * num_2) == num_1 * num_1)
                return Integer.valueOf(num_1);
            else if ((num_1 * num_1) + (num_2 * num_2) == num_0 * num_0)
                return Integer.valueOf(num_0);
            else {
                return null;
            }
        } catch (Exception e) {
            throw new IOException(" Caught exception processing input row", e);
        }
    }

}

私はここで何が間違っているのだろうと思っていました。どんなポインタでも大歓迎です。ありがとう。

4

1 に答える 1

0

スモッド、

いくつかの変更を行う必要があります。

あなたの LOAD ステートメントは、適切なタプルを生成していないようです。また、機能も少し変更する必要があります。

私が行ったコードの変更を参照してください。ご不明な点がございましたら、お知らせください。

REGISTER PIGTrnFilter.jar;
A = LOAD '/home/hadoop/lab/examples/PigTrnTest.txt' AS (side_0:int, side_1:int, side_2:int);
B = FILTER A BY (inverika.training.examples.RAT(TOTUPLE(A.side_0, A.side_1, A.side_2)) != 0);
DUMP B;

フィルター機能は以下のとおりです。

package inverika.training.examples;

import java.io.IOException;
import org.apache.pig.EvalFunc;
import org.apache.pig.data.Tuple;

public class RAT extends EvalFunc<Integer>{
    public Integer exec(Tuple TT) throws IOException {
        if (TT == null || TT.size() == 0) {
            return null;
        }
        try {           
            Object tupleObject = TT.get(0);

            Tuple input = (Tuple) tupleObject;

            Object object0 = input.get(0);
            Object object1 = input.get(1);
            Object object2 = input.get(2);

            int num_0 = (Integer) object0;
            int num_1 = (Integer) object1;
            int num_2 = (Integer) object2;

            if ((num_0 * num_0) + (num_1 * num_1) == num_2 * num_2) 
                return Integer.valueOf(num_2);
            else if ((num_0 * num_0) + (num_2 * num_2) == num_1 * num_1)
                return Integer.valueOf(num_1);
            else if ((num_1 * num_1) + (num_2 * num_2) == num_0 * num_0)
                return Integer.valueOf(num_0);
            else {
                return new Integer(0);
            }
        } catch (Exception e) {
            throw new IOException(" Caught exception processing input row", e);
        }
    }
}

csv ではなく、タブ区切りのデータを使用していることに注意してください。csv がある場合は、PigStorage 関数を使用してロードする必要があります。

1   2   3
2   5   2
2   2   2
1   3   7
7   2   10
3   4   5

私はあなたが従うことができると思うマイナーな変更を加えました. 私が行った変更を理解するために関係スキーマを見てください。EvalFunc よりも Boolean を返す FilerFunc を実際に使用できます。これがお役に立てば幸いです。

于 2013-03-27T14:29:12.987 に答える