PIG UDF导入解析

时间:2016-07-06 23:34:15

标签: java apache-pig

UDF新手。借了另一篇文章作为模板,但我认为不一样 ERROR 1070: Could not resolve myudfs.UPPER using imports: [, org.apache.pig.builtin., org.apache.pig.impl.builtin.]

脚本

register /home/tad/pig/myudf.jar;
quantiles = LOAD '/user/tad/quantiles' using PigStorage('\t','-schema');
--just one line of data
a = foreach quantiles generate 'a';
b = foreach a generate myudfs.UPPER($0);

功能

package myudfs;
import java.io.IOException;
import org.apache.pig.EvalFunc;
import org.apache.pig.data.Tuple;

public class UPPER extends EvalFunc<String>
{
  public String exec(Tuple input) throws IOException {
      if (input == null || input.size() == 0 || input.get(0) == null)
          return null;
      try{
          String str = (String)input.get(0);
         return str.toUpperCase();
      }catch(Exception e){
          throw new IOException("Caught exception processing input row ", e);
      }
  }
}

注册时不会报告错误,这意味着猪找到了jar文件。

从Grunt

运行

jar

的结构
META-INF
myudf
 +--UPPER.java
 +--IndexOfBig.java
 +--IndexOfBig.class
 +--pig.jar
 +--UPPER.class

1 个答案:

答案 0 :(得分:1)

您的jar结构中没有包,您可以添加它或从脚本中删除它。

1-添加包结构(此处不需要pig.jar):

myudfs
  +-- UPPER.java
  +-- IndexOfBig.java
  +-- IndexOfBig.class
  +-- UPPER.class

2-或者从代码和脚本中删除它并保持jar原样:

脚本

b = foreach a generate UPPER($0);

<强>功能

//package myudfs; // remove this line
import java.io.IOException;
import org.apache.pig.EvalFunc;
import org.apache.pig.data.Tuple;

public class UPPER extends EvalFunc<String>
{
 ..

如果jar在本地文件系统中:

register /localpath/tad/pig/myudf.jar;

如果它在hdfs中:

register hdfs://namenode:port/tad/pig/myudf.jar;

最后,根据您的构建工具,清单属性可能没有设置为作为猪udf正常工作,为了摆脱它,使用命令行轻松将class文件打包到jar文件中使用此命令:

jar cf myjar IndexOfBig.class UPPER.class