我正在试验Pig的自定义项。我能够得到简单的自定义项喜欢大写为我工作。所以我试着写我自己的自定义项。我想处理一个包含3个整数的输入文件的每一行。如果3个整数满足直角三角形边的条件,则返回斜边,否则返回null。
但我得到以下错误-错误1066:无法打开别名b的迭代器
这是Pig的脚本代码-
-- 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);
}
}
}
我在想我做错了什么。感谢您的指点。谢谢。
1条答案
按热度按时间mwngjboj1#
苏木德,
你需要做几个改变。
load语句似乎没有生成正确的元组。而且功能也需要稍微改变一下。
请看我所做的代码修改。有什么问题请告诉我。
过滤器功能如下。
请注意,我使用的是选项卡分隔的数据,而不是csv。如果你有一个csv,那么你需要使用pigstorage函数来加载。
我做了一些小的修改,我想你可以照做。查看关系模式以了解我所做的更改。实际上,可以使用返回布尔值的filerfunc,而不是evalfunc。希望这对你有帮助。