【问题标题】:Pig Java UDF IssuePig Java UDF 问题
【发布时间】:2016-12-04 00:22:01
【问题描述】:

这里是 UDF 代码

package myudf;
import java.io.IOException; 
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.apache.pig.EvalFunc; 
import org.apache.pig.data.Tuple; 

public class DateFormat extends EvalFunc<String> {
    public String exec(Tuple input) throws IOException {
        if (input == null || input.size() == 0) {
            return null;
        }

        try {
            String dateStr = (String)input.get(0);
            SimpleDateFormat readFormat = new SimpleDateFormat( "MM/dd/yyyy hh:mm:ss.SSS aa");
            SimpleDateFormat writeFormat = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss.SSS");
            Date date = null;
            try {
                date = readFormat.parse(dateStr);
            } catch (ParseException e) {
                e.printStackTrace();
            }

            return writeFormat.format(date).toString();
        } catch(Exception e) {
            throw new IOException("Caught exception processing input row ", e);
        }
    }
}

导出了一个 Jar 并在 grunt 中注册

    Register /local/path/to/UDFDate.jar;
    A = LOAD 'hdfs date file';
    B = FOREACH A GENERATE UDFDate.myudf.DateFormat($0);

报错

[main] 错误 org.apache.pig.tools.grunt.Grunt - 错误 1070:不能 使用导入解析 UDFDate.DateFormat:[, java.lang., org.apache.pig.builtin., org.apache.pig.impl.builtin.]

【问题讨论】:

  • 什么是myudf。你的包 UDFDate 中有 java 文件 myudf 吗?
  • DateFormat.java 文件的第一行是什么?
  • 对不起伙计们..我错过了包名..

标签: java apache-pig udf


【解决方案1】:

您无需指定 jar 名称 (UDFDate.myudf.DateFormat) 即可调用 jar 中的函数。它应该是“packageName.className”(myudf.DateFormat)。


如果DateFormat 在myudf 包中,那么您应该运行为:

B = FOREACH A GENERATE myudf.DateFormat($0);


如果DateFormat 在default 包中,那么您应该运行为:

B = FOREACH A GENERATE DateFormat($0);

【讨论】:

    【解决方案2】:

    将您的 udf 称为:

    packagename.classname($0);
    

    【讨论】:

      【解决方案3】:

      已经给出了答案,但是为了基本上不会每次都重新定义UDF调用,您可以简化它:

      Register /local/path/to/UDFDate.jar;
      DEFINE myDateFormat myudf.DateFormat();
      A = LOAD 'hdfs date file';
      B = FOREACH A GENERATE myDateFormat($0);
      

      【讨论】:

        猜你喜欢
        • 2013-05-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-27
        相关资源
        最近更新 更多