gpt4 book ai didi

hadoop - PigLatin-本地模式-错误1066:无法打开别名B的迭代器

转载 作者:行者123 更新时间:2023-12-02 21:55:02 26 4
gpt4 key购买 nike

我正在试验Pig UDF。我可以获得像大写字母这样的简单UDF为我工作。所以我试图编写自己的UDF。我想处理包含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);
}
}

}

我想知道我在这里做错了什么。任何指针表示赞赏。谢谢。

最佳答案

苏莫德

您需要做一些更改。

您的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,它返回比EvalFunc bool(boolean) 的 bool(boolean) 值。希望这对您有所帮助。

关于hadoop - PigLatin-本地模式-错误1066:无法打开别名B的迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15658795/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com