java - 将多个参数传递给 Pig Filter UDF

标签 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);

对于上述所有选项,我收到与“无效的标量投影:需要从关系中投影列才能用作标量。”相同的错误。

对于第一种情况,我的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)

在 UDF 中解析它们

关于java - 将多个参数传递给 Pig Filter UDF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34114992/

相关文章:

Hadoop pig 过滤器

hadoop - pig 脚本错误

java - 如何使用 Try-with-Resources 两次使用 PreparedStatement?

java - 如何使用 vm 参数从命令行运行 JUnit?

java - 展开文件名,重新插入到属性对象中

java - Swing/Java : How to use the getText and setText string properly

Hadoop MultipleOutPutFormat 和连接查询

hadoop - 在 Hadoop HDFS 中高效存储每日转储

performance - 协助减少 distcp 操作的执行时间

hadoop - Pig sum 因 +ve 和 -ve 值而失败