将多个参数传递给 Pig Filter UDF
Pass mutiple parameters to Pig Filter UDF
我是 Pig 脚本的新手。
我想将多个参数传递给 Pig 过滤器 UDF,但出现错误 "Invalid scalar projection : A column needs to be projected from a relation for it to be used as a scalar"
我正在执行以下步骤。
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 [=11=],,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);
对于上述所有选项,我得到与 "Invalid scalar projection : A column needs to be projected from a relation for it to be used as a scalar."
相同的错误
第一种情况,我的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?
"Invalid scalar projection" 错误背后的原因是什么?
在此先感谢您的帮助。
我不太确定你试图用你的 UDF 计算什么,因为你的问题描述有点含糊,但在你所有的三个代码示例中,你都试图传递一个与你的 UDF 的关系,这不会真的没有意义(input、dataWithVal 和 interData 是 relations)。您需要传递它 values。所以说你正在使用你的 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)
在 UDF 中解析它们
我是 Pig 脚本的新手。
我想将多个参数传递给 Pig 过滤器 UDF,但出现错误 "Invalid scalar projection : A column needs to be projected from a relation for it to be used as a scalar"
我正在执行以下步骤。
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 [=11=],,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);
对于上述所有选项,我得到与 "Invalid scalar projection : A column needs to be projected from a relation for it to be used as a scalar."
相同的错误第一种情况,我的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? "Invalid scalar projection" 错误背后的原因是什么?
在此先感谢您的帮助。
我不太确定你试图用你的 UDF 计算什么,因为你的问题描述有点含糊,但在你所有的三个代码示例中,你都试图传递一个与你的 UDF 的关系,这不会真的没有意义(input、dataWithVal 和 interData 是 relations)。您需要传递它 values。所以说你正在使用你的 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)