将多个参数传递给Pig Filter UDF

时间:2015-12-06 07:09:33

标签: java hadoop apache-pig udf

我是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? "标量投影无效"背后的原因是什么?错误?

先谢谢你的帮助。

1 个答案:

答案 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)

在UDF中解析它们