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

我做了一些小的修改,我想你可以遵循。查看关系模式以了解我所做的更改。您实际上可以使用 FilerFunc,它返回 Boolean 而不是 EvalFunc。希望这对您有所帮助。

于 2013-03-27T14:29:12.987 回答