【问题标题】:passing parameters to pig udf could not instantiate with arguments将参数传递给 pig udf 无法使用参数实例化
【发布时间】:2017-07-27 03:28:12
【问题描述】:

我正在尝试编写可以接受参数的猪 UDF。

我看了一些博客,了解到可以通过添加参数化构造函数来完成。

所以我的 UDF 代码是:

import java.io.IOException;
import java.util.List;

import org.apache.pig.EvalFunc;
import org.apache.pig.data.Tuple;
import org.apache.commons.lang.StringUtils;
public class LeftPad extends EvalFunc<String> {

    String size;
    String padChar;
    public LeftPad(String size, String padChar) {
        // TODO Auto-generated constructor stub
        this.size = size;
        this.padChar = padChar;
    }

    @Override
    public String exec(Tuple input) throws IOException {
        try {
            if (input == null || input.size() == 0)
                return null;
            String str = (String) input.get(0);         
            return StringUtils.leftPad(str, Integer.valueOf(size), padChar).toString();

        } catch (Exception exception) {
            exception.printStackTrace();
        }
        return null;
    }
}

还尝试将构造函数定义为:

public LeftPad(int size, Char padChar)

但它只支持String的read somwhere改成了上面的。

在 grunt 控制台上使用的脚本行:

REGISTER pig_udf4.jar
DEFINE l_pad pig_udf4.LeftPad('12','x');
data = Load myData.csv USING PigStorage(,) as (....);
C = FOREACH data GENERATE l_pad('12','x');
DUMP C;

尝试将第 4 行更改为

C = FOREACH data GENERATE l_pad();

但仍然面临同样的问题。

日志:

Pig Stack Trace
---------------
ERROR 1200: could not instantiate 'LeftPad' with arguments '[12, x]'

Failed to parse: could not instantiate 'LeftPad' with arguments '[12, x]'
        at org.apache.pig.parser.QueryParserDriver.parse(QueryParserDriver.java:201)
        at org.apache.pig.PigServer$Graph.validateQuery(PigServer.java:1791)
        at org.apache.pig.PigServer$Graph.registerQuery(PigServer.java:1764)
        at org.apache.pig.PigServer.registerQuery(PigServer.java:707)
        at org.apache.pig.tools.grunt.GruntParser.processPig(GruntParser.java:1075)
        at org.apache.pig.tools.pigscript.parser.PigScriptParser.parse(PigScriptParser.java:505)
        at org.apache.pig.tools.grunt.GruntParser.parseStopOnError(GruntParser.java:231)
        at org.apache.pig.tools.grunt.GruntParser.parseStopOnError(GruntParser.java:206)
        at org.apache.pig.tools.grunt.Grunt.run(Grunt.java:66)
        at org.apache.pig.Main.run(Main.java:564)
        at org.apache.pig.Main.main(Main.java:176)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.apache.hadoop.util.RunJar.run(RunJar.java:221)
        at org.apache.hadoop.util.RunJar.main(RunJar.java:136)
Caused by: java.lang.RuntimeException: could not instantiate 'LeftPad' with arguments '[12, x]'
        at org.apache.pig.impl.PigContext.instantiateFuncFromSpec(PigContext.java:759)
        at org.apache.pig.newplan.logical.expression.UserFuncExpression.getFieldSchema(UserFuncExpression.java:222)
        at org.apache.pig.newplan.logical.optimizer.FieldSchemaResetter.execute(SchemaResetter.java:264)
        at org.apache.pig.newplan.logical.expression.AllSameExpressionVisitor.visit(AllSameExpressionVisitor.java:143)
        at org.apache.pig.newplan.logical.expression.UserFuncExpression.accept(UserFuncExpression.java:113)
        at org.apache.pig.newplan.ReverseDependencyOrderWalker.walk(ReverseDependencyOrderWalker.java:70)
        at org.apache.pig.newplan.PlanVisitor.visit(PlanVisitor.java:52)
        at org.apache.pig.newplan.logical.optimizer.SchemaResetter.visitAll(SchemaResetter.java:67)
        at org.apache.pig.newplan.logical.optimizer.SchemaResetter.visit(SchemaResetter.java:122)
        at org.apache.pig.newplan.logical.relational.LOGenerate.accept(LOGenerate.java:245)
        at org.apache.pig.newplan.DependencyOrderWalker.walk(DependencyOrderWalker.java:75)
        at org.apache.pig.newplan.logical.optimizer.SchemaResetter.visit(SchemaResetter.java:114)
        at org.apache.pig.parser.LogicalPlanBuilder.buildForeachOp(LogicalPlanBuilder.java:1055)
        at org.apache.pig.parser.LogicalPlanGenerator.foreach_clause(LogicalPlanGenerator.java:15896)
        at org.apache.pig.parser.LogicalPlanGenerator.op_clause(LogicalPlanGenerator.java:1933)
        at org.apache.pig.parser.LogicalPlanGenerator.general_statement(LogicalPlanGenerator.java:1102)
        at org.apache.pig.parser.LogicalPlanGenerator.statement(LogicalPlanGenerator.java:560)
        at org.apache.pig.parser.LogicalPlanGenerator.query(LogicalPlanGenerator.java:421)
        at org.apache.pig.parser.QueryParserDriver.parse(QueryParserDriver.java:191)
        ... 16 more
Caused by: java.lang.NoSuchMethodException: LeftPad.<init>([Ljava.lang.String;)
        at java.lang.Class.getConstructor0(Class.java:3082)
        at java.lang.Class.getConstructor(Class.java:1825)
        at org.apache.pig.impl.PigContext.instantiateFuncFromSpec(PigContext.java:746)
        ... 34 more
================================================================================

【问题讨论】:

    标签: java hadoop apache-pig user-defined-functions udf


    【解决方案1】:

    NoSuchMethodException: LeftPad.([Ljava.lang.String;)

    你给了一个字符串数组,而不是两个字符串。

    添加另一个构造函数

    public LeftPad(String... args) {
        this(args[0], args[1]);
    }
    

    除此之外,我怀疑您是否需要DEFINE

    您的参数被传递到输入元组中,因此您可以从中获取大小和字符

    【讨论】:

    • 如前所述添加了构造函数,现在日志显示 - ERROR 1070: Could not resolve pig_udf4.LeftPad using imports: [, java.lang., org.apache.pig.builtin., org.apache.pig.impl.builtin.] Failed to parse: Pig script failed to parse: &lt;line 3, column 36&gt; Failed to generate logical plan. Nested exception: org.apache.pig.backend.executionengine.ExecException: ERROR 1070 : Could not resolve pig_udf4.LeftPad using imports: [, java.lang., org.apache.pig.builtin., org.apache.pig.impl.builtin.] 尝试过 `C = FOREACH panasonic_data GENERATE l_pad('12','x');` & l_pad() too
    • 该错误表明您没有正确注册 jar 和 UDF
    • 我在注册和定义方面没有遇到任何问题,尽管如问题中的陈述所述。现在,我将尝试注册和定义 Jar 的替代方案。
    • 我觉得你只要正确使用exec函数就可以了
    • 对我有用的是制作类本身的 jar。可能是因为我在默认包中创建了所有 udf,因此在定义类和注册 jar 时没有指定完全限定的包名。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多