如何在 Hive 中创建 UDF

Posted

技术标签:

【中文标题】如何在 Hive 中创建 UDF【英文标题】:How to create UDF in Hive 【发布时间】:2013-12-14 13:58:18 【问题描述】:

嗨,我是 hive 的新手,我正在尝试在名为 ConvertDateFormetUDF 的 hive 中创建 UDF。在创建临时功能时,我收到以下错误,请帮帮我。有人可以遵循的步骤吗?请:

Hive> Add jar /home/cloudera/date.jar 
Added /home/cloudera/date.jar to class path
Added resource: /home/cloudera/date.jar
hive> CREATE TEMPORARY FUNCTION fun as 'com.db.acedq.opal.hive.ConvertDateFormatUDF';
java.lang.NoClassDefFoundError: org/apache/pig/EvalFunc
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631)  
at java.lang.ClassLoader.defineClass(ClassLoader.java:615)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:283)
at java.net.URLClassLoader.access$000(URLClassLoader.java:58)
at java.net.URLClassLoader$1.run(URLClassLoader.java:197)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:247)
at org.apache.hadoop.hive.ql.exec.FunctionTask.getUdfClass(FunctionTask.java:105)
at org.apache.hadoop.hive.ql.exec.FunctionTask.createFunction(FunctionTask.java:75)
at org.apache.hadoop.hive.ql.exec.FunctionTask.execute(FunctionTask.java:63)
at org.apache.hadoop.hive.ql.exec.Task.executeTask(Task.java:138)
at org.apache.hadoop.hive.ql.exec.TaskRunner.runSequential(TaskRunner.java:57)
at org.apache.hadoop.hive.ql.Driver.launchTask(Driver.java:1374)
at org.apache.hadoop.hive.ql.Driver.execute(Driver.java:1160)
at org.apache.hadoop.hive.ql.Driver.run(Driver.java:973)
at org.apache.hadoop.hive.ql.Driver.run(Driver.java:893)
at org.apache.hadoop.hive.cli.CliDriver.processLocalCmd(CliDriver.java:259)
at org.apache.hadoop.hive.cli.CliDriver.processCmd(CliDriver.java:216)
at org.apache.hadoop.hive.cli.CliDriver.processLine(CliDriver.java:412)
at org.apache.hadoop.hive.cli.CliDriver.run(CliDriver.java:759)
at org.apache.hadoop.hive.cli.CliDriver.main(CliDriver.java:613)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.hadoop.util.RunJar.main(RunJar.java:208)
Caused by: java.lang.ClassNotFoundException: org.apache.pig.EvalFunc
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
... 32 more
FAILED: Execution Error, return code -101 from    org.apache.hadoop.hive.ql.exec.FunctionTask

【问题讨论】:

你能分享你的UDF代码吗? @MukeshS 这是我的代码包 com.db.acedq.opal.hive;导入 java.io.IOException;导入 java.text.SimpleDateFormat;导入 org.apache.pig.EvalFunc;导入 org.apache.pig.data.Tuple;导入 org.mortbay.jetty.HttpParser.Input;公共类 ConvertDateFormatUDF 扩展 EvalFunc String empty = ""; public String exec(Tuple input) throws IOException if ((input == null) || input.size() == 0 || (input.get(0)== null) || input.get(1) = = null) return null; 字符串字段 = (String)input.get(0).toString(); String ToFormat = (String) input.get(1).toString(); 字符串 FromFormat = null; if (input.size()>2 && input.get(2)!= null) FromFormat = (String) input.get(2).toString(); String val = ConvertDateFormatModule.convert(field,ToFormat,FromFormat );返回值; 包 com.db.acedq.opal.hive;导入 java.text.ParseException;导入 java.text.SimpleDateFormat;导入 java.util.Date;公共类 ConvertDateFormatModule public static String convert(String field, String toFormat, String fromFormat) if (field == null || toFormat == null || field.toString().length()==0 || toFormat.toString ().length() == 0) 返回 ""; else SimpleDateFormat dateformat = new SimpleDateFormat( fromFormat == null ? "dd/mm/yyy":fromFormat); SimpleDateFormat TodateFormat = new SimpleDateFormat(toFormat); dateformat.setLenient(false);尝试 日期 x = dateformat.parse(field);返回 TodateFormat.format(x); catch (ParseException e) String empty="";返回空=“”; 【参考方案1】:

似乎您正在创建的 UDF 的 java 代码是指 PIG 库。在创建 Hive UDF 时,您应该包含 hive 库。我在下面的链接http://lets-do-something-big.blogspot.in/2014/02/hive-udf-example.html 中提到了整个过程。如果您仍然遇到问题,请告诉我

【讨论】:

以上是关于如何在 Hive 中创建 UDF的主要内容,如果未能解决你的问题,请参考以下文章

确定在 Hive 中创建 UDF 的语言

Hive UDF 运行:在 hive 中创建临时函数时出错

如何在Hive&Impala中使用UDF

0011-如何在Hive & Impala中使用UDF

描述 hive 自定义 UDF 文档

如何在 Redshift 中创建自定义聚合 UDF 函数?