配置单元自定义UDF类未发现问题

时间:2019-11-13 13:38:06

标签: java maven hive

我正在如下构建我的UDF: test_udf.java

package test;

import org.apache.commons.lang.StringUtils;
import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.io.Text;

public class Strip extends UDF{
  private Text result = new Text();

  public Text evaluate(Text str){
    if ( str == null){
      return null;
    }

    result.set(StringUtils.strip(str.toString()));
    return result;
  }

  public Text evaluate(Text str,String stripChars){
    if ( str == null){
      return null;
    }

    result.set(StringUtils.strip(str.toString(),stripChars));
    return result;
  }
}

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>sdf.dennis.com</groupId>
  <artifactId>test_udf</artifactId>
  <version>1.0</version>

  <name>hive</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>
    <dependency>
        <groupId>org.apache.hive</groupId>
        <artifactId>hive-exec</artifactId>
        <version>2.1.1</version>
    </dependency>
    <dependency>
        <groupId>org.apache.hadoop</groupId>
        <artifactId>hadoop-common</artifactId>
        <version>3.0.0</version>
    </dependency>
  </dependencies>
  <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>2.2</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
 </build>
</project>

我使用了命令mvn clean package。然后在目标文件夹中生成了test_udf-1.0.jar

但是,我将jar文件添加到hive中并创建了一个临时函数,它显示:

hive> add jar file:///home/dennis/java/target/test_udf-1.0.jar;
Added [file:///home/dennis/java/target/test_udf-1.0.jar] to class path
Added resources: [file:///home/dennis/java/target/test_udf-1.0.jar]
hive> create temporary function test_s as 'test.strip';
FAILED: Class test.strip not found
FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.FunctionTask
hive> create temporary function test_s as 'test.Strip';
FAILED: Class test.Strip not found
FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.FunctionTask

我不知道自己犯了什么错误?

解压缩的文件:

about_files                     groovyjarjarantlr            jodd                         module.properties                                     plugin.properties
about.html                      groovyjarjarasm              junit                        mozilla                                               plugin.xml
antlr                           groovyjarjarcommonscli       keytab.txt                   net                                                   properties.dtd
assets                          hdfs-default.xml             krb5-template.conf           org                                                   PropertyList-1.0.dtd
au                              hive-exec-log4j2.properties  krb5_udp-template.conf       org-apache-calcite-jdbc.properties                    schema
ccache.txt                      hive-log4j2.properties       license                      org.apache.hadoop.application-classloader.properties  shaded
codegen                         images                       LICENSE.txt                  org.codehaus.commons.compiler.properties              stylesheet.css
com                             javaewah                     log4j2.component.properties  overview.html                                         templates
common-version-info.properties  javax                        Log4j-config.xsd             overviewj.html                                        testpool.jocl
core-default.xml                javolution                   Log4j-events.dtd             package.jdo                                           tez-container-log4j2.properties
fr                              jersey                       Log4j-events.xsd             parquet                                               webapps
google                          jetty-dir.css                Log4j-levels.xsd             parquet-logging.properties                            yarn-default.xml
groovy                          jline                        META-INF                     parquet.thrift                                        yarn-version-info.properties

1 个答案:

答案 0 :(得分:0)

可以尝试使用Macros。

CREATE TEMPORARY MACRO fn_maskNull(input decimal(25,3))
    CASE
        WHEN input IS NULL THEN 0 else input
    END;
-- usage
select fn_maskNull(null), fn_maskNull(101);

更多信息:https://medium.com/@gchandra/create-user-defined-functions-in-hive-beeline-ff965285d735