将多个参数传递给 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 中解析它们