我是 Pig 脚本的新手。
我想将多个参数传递给 Pig 过滤器 UDF,但出现错误“无效的标量投影:需要从关系中投影列才能将其用作标量”
我正在执行以下步骤。
input = load '....';
dump input; /* working able to see data*/
output = FILTER input by not FilterUDF(input,val1,val2);
这没有用。所以我试着跟随。
input = load '......';
dump input; /* working able to see data*/
dataWithVal = FOREACH input GENERATE $0,$1,val1,val2;
dump dataWithVal; /* working able to see data with values*/
output = FILTER dataWithVal by not FilterUDF(dataWithVal);
这也没有用。所以我在一个文件中添加了我的值,将该文件复制到 HDFS 中,然后将其与输入数据交叉连接,但仍然出现相同的错误。
input = load '........';
dump input; /* working able to see data*/
val = load '........';
dump val; /* working able to values*/
interData = cross input, val;
dump interData; /* working able to see cross joined data*/
output = FILTER interData by not FilterUDF(interData);
对于上述所有选项,我收到与“无效的标量投影:需要从关系中投影列才能用作标量。”相同的错误。
对于第一种情况,我的FilterUDF结构如下。
import org.apache.pig.FilterFunc;
import java.io.IOException;
import org.apache.pig.data.Tuple;
public class FilterUDF extends FilterFunc {
public boolean exec(Tuple input, int val, String Val) throws IOException {
/*some code here*/
}
}
案例一的替代方案已尝试但未奏效。
import org.apache.pig.FilterFunc;
import java.io.IOException;
import org.apache.pig.data.Tuple;
public class FilterUDF extends FilterFunc {
private Tuple input;
private int Ival;
private String Sval;
public FilterUDF(Tuple input, int Ival, String Sval){
this.input = input;
this.Ival = Ival;
this.Sval = Sval;
}
public Boolean exec(Tuple arg0) throws IOException {
/*Some code*/
}
}
对于情况二和三,我的FilterUDF结构如下。
import org.apache.pig.FilterFunc;
import java.io.IOException;
import org.apache.pig.data.Tuple;
public class FilterUDF extends FilterFunc {
public Boolean exec(Tuple input) throws IOException {
/*some code here*/
}
}
我做错了什么? 如何将多个参数传递给 Pig UDF? “无效标量投影”错误背后的原因是什么?
预先感谢您的帮助。
最佳答案
我不完全确定你试图用你的 UDF 计算什么,因为你的问题描述有点模糊,但在你所有的三个代码示例中,你试图传递一个关系到你的 UDF,这不会真的很有意义(输入、dataWithVal 和 interData 是关系)。您需要向它传递值。所以说你正在使用你的 UDF 来断言 val1 和 val2 是相同的(或其他),那么你可以写
input = LOAD '...'; /* load some data */
output = FILTER input BY FilterUDF(val1, val2);
你的 UDF 看起来像
import org.apache.pig.FilterFunc;
import java.io.IOException;
import org.apache.pig.data.Tuple;
public class FilterUDF extends FilterFunc {
public Boolean exec(Tuple input) throws IOException {
if (input == null || input.size() == 0)
return null;
int val1 = input.get(0) // gets val1 from pig
int val2 = input.get(1) // gets val2 from pig
/*rest of code*/
}
}
如您所见,您可以向 UDF 传递任意数量的参数;这就是 org.apache.pig.data.Tuple
的用途;只需根据需要传递尽可能多的参数,然后使用 .get(i)
关于java - 将多个参数传递给 Pig Filter UDF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34114992/