我是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);
对于上述所有选项,我得到的错误与#34相同;标量投影无效:需要从关系中投射一列,以便将其用作标量。"
对于第一种情况,我的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? "标量投影无效"背后的原因是什么?错误?
先谢谢你的帮助。
答案 0 :(得分:0)
我不完全确定您尝试使用UDF计算的内容,因为您的问题描述有点模糊,但在所有三个代码示例中,您都试图将关系传递给您的UDF,而这与UDF无关。 #39; t真有意义(input,dataWithVal和interData是 relationship )。您需要传递值。所以说你使用你的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)