Hive提供了很多内建函数来满足您的计算需求,您也可以通过创建自定义函数(UDF)来满足不同的计算需求。UDF在使用上与普通的内建函数类似。本文为您介绍自定义函数的开发和使用流程。

背景信息

UDF分类如下表。
UDF分类描述
UDF(User Defined Scalar Function)自定义标量函数,通常称为UDF。其输入与输出是一对一的关系,即读入一行数据,写出一条输出值。
UDTF(User Defined Table-valued Function)自定义表值函数,用来解决一次函数调用输出多行数据场景的,也是唯一一个可以返回多个字段的自定义函数。
UDAF(User Defined Aggregation Function)自定义聚合函数,其输入与输出是多对一的关系,即将多条输入记录聚合成一条输出值,可以与SQL中的Group By语句联合使用。

开发UDF

  1. 使用IDE,创建Maven工程。
    工程基本信息如下,您可以自定义groupId和artifactId。
    <groupId>org.example</groupId>
    <artifactId>hiveudf</artifactId>
    <version>1.0-SNAPSHOT</version>
  2. 添加pom依赖。
    <dependency>
          <groupId>org.apache.hive</groupId>
          <artifactId>hive-exec</artifactId>
          <version>2.3.7</version>
          <exclusions>
             <exclusion>
               <groupId>org.pentaho</groupId>
               <artifactId>*</artifactId>
             </exclusion>
          </exclusions>
    </dependency>
  3. 创建一个类,继承Hive UDF类。
    类名您可以自定义,本文示例中类名为MyUDF。
    package org.example;
    
    import org.apache.hadoop.hive.ql.exec.UDF;
    
    /**
     * Hello world!
     *
     */
    public class MyUDF extends UDF
    {
        public String evaluate(final String s) {
            if (s == null) { return null; }
            return s + ":HelloWorld";
        }
    }
  4. 将自定义的代码打成JAR包。
    pom.xml所在目录,执行如下命令制作JAR包。
    mvn clean package -DskipTests
    target目录下会出现hiveudf-1.0-SNAPSHOT.jar的JAR包,即代表完成了UDF开发工作。

使用UDF

  1. 使用文件传输工具,上传生成的JAR包至集群root目录。
    本示例使用了文件传输工具(SSH Secure File Transfer Client)。
  2. 上传JAR包至HDFS。
    1. 通过SSH方式登录集群,详情请参见登录集群
    2. 执行以下命令,上传JAR包到HDFS。
      hadoop fs -put hiveudf-1.0-SNAPSHOT.jar /user/hive/warehouse/
      您可以通过hadoop fs -ls /user/hive/warehouse/命令,查看是否上传成功。待返回信息如下所示表示上传成功。
      Found 1 items
      -rw-r--r--   1 xx xx 2668 2021-06-09 14:13 /user/hive/warehouse/hiveudf-1.0-SNAPSHOT.jar
  3. 创建UDF函数。
    1. 执行以下命令,进入Hive命令行。
      hive
    2. 执行以下命令,应用生成的JAR包创建函数。
      create function myfunc as "org.example.MyUDF" using jar "hdfs:///user/hive/warehouse/hiveudf-1.0-SNAPSHOT.jar";

      代码中的myfunc是UDF函数的名称,org.example.MyUDF开发UDF中创建的类,hdfs:///user/hive/warehouse/hiveudf-1.0-SNAPSHOT.jar为上传JAR包到HDFS的路径。

      当出现以下信息时,表示创建成功。
      Added [/private/var/folders/2s/wzzsgpn13rn8rl_0fc4xxkc00000gp/T/40608d4a-a0e1-4bf5-92e8-b875fa6a1e53_resources/hiveudf-1.0-SNAPSHOT.jar] to class path
      Added resources: [hdfs:///user/hive/warehouse/myfunc/hiveudf-1.0-SNAPSHOT.jar]
      说明 您也可以通过命令SHOW FUNCTIONS LIKE '*myfunc*',验证函数是否创建成功。
  4. 执行以下命令,使用UDF函数。
    该函数与内置函数使用方式一样,直接使用函数名称即可访问。
    select myfunc("abc");
    返回如下信息。
    OK
    abc:HelloWorld

相关文档