hive自定义函数(UDF)

概述

用户自定义函数(UDF)是一个允许用户扩展HiveQL的强大的功能。用户可以使用Java编写自己的UDF,一旦将用户自定义函数加入到用户会话中(交互式的或者通过脚本执行的),它们就将和内置的函数一样使用,甚至可以提供联机帮助。Hive具有多种类型的用户自定义函数,每一种都会针对输入数据执行特定“一类”的转换过程。

在ETL处理中,一个处理过程可能包含多个处理步骤。Hive语言具有多种方式来将上一步骤的输入通过管道传递给下一个步骤,然后在一个查询中产生众多输出。用户同样可以针对一些特定的处理过程编写自定义函数。如果没有这个功能,那么一个处理过程可能就需要包含一个MapReduce步骤或者需要将数据转移到另一个系统中来实现这些改变。因此,Hive提供了用户自定义函数(UDF),UDF是在Hive查询产生的相同的task进程中执行的,因此它们可以高效地执行。

自定义函数分类

用户自定义函数类别分为以下三种

  • (1)UDF(User-Defined-Function):一进一出
  • (2)UDAF(User-Defined Aggregation Function)聚集函数,多进一出,类似于:count/max/min
  • (3)UDTF(User-Defined Table-Generating Functions)一进多出,如 lateral view explore()

创建自定义函数的步骤

  • 1、编写自定义函数
  • 2、编译部署
  • 3、在hive中注册自定义函数
  • 4、使用自定义函数
  • 5、销毁自定义函数

1、编写UDF

编写一个UDF,需要继承org.apache.hadoop.hive.ql.exec.UDF并实现evaluate()函数。在查询过程中,查询中对应的每个应用到这个函数的地方都会对这个类进行实例化。对于每行输入都会调用evaluate()函数。而evaluate()处理后的值会返回给Hive。同时用户是可以重载evaluate方法的。Hive会像Java的方法重载一样,自动选择匹配的方法。

package com.itclj.hive.udf;

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

/**
 * @Author lujun.chen
 * @Date 2020/1/20 10:02
 * @Version 1.0
 */
public class ItcljUdf extends UDF {
    /**
     * 这里接收参数的类型必须是hadoop能支持的输入输出类型
     * */
    public Text evaluate(final Text s) {
        if (s == null) {
            return null;
        }
        return new Text(s.toString().toLowerCase());
    }
}

注意

(1)UDF 必须要有返回类型,可以返回 null,但是返回类型不能为 void;

2、编译部署

自定义函数代码编写完毕后,需要编译打包成Jar,并加到hive的classpath。

2.1 编译

工程如果用maven构建,直接用mvn clean package命令将自定义函数代码打成jar包。

2.2 部署

hive如果是本地模式,自定义函数jar包部署将采用本地模式部署,如果是非本地模式,自定义函数jar需要放到共享存储(如hdfs)上。

2.2.1 本地模式部署

进入hive的命令行客户端

hive> add jar hive-udf-demo-1.0.0.jar;
Added hive-udf-demo-1.0.0.jar to class path

默认情况下,jar包会被放入当前目录,你也可以指定全路径。

hive> add jar /tmp/hive-udf-demo-1.0.0.jar;
Added /tmp/hive-udf-demo-1.0.0.jar to class path

这样当前会话下所有启动的 job 的 classpath 下都会加入这个jar。classpath下加入了哪些jar可以用下面命令查看。

hive> list jars;
hive-udf-demo-1.0.0.jar
2.2.2 hdfs部署

直接把jar上传hdfs文件系统。

hadoop fs -put hive-udf-demo-1.0.0.jar /user/itclj/hive-udf-demo-1.0.0.jar

3、注册函数

3.3 临时函数

临时函数用于解决一些临时特殊的业务需求而开发的函数,hive中注册的临时函数只在当前会话可用,注册函数的时候用temporary关键字声名。

语法

create [temporary] function [dbname.]function_name AS class_name;

3.3 永久函数

hive函数注册的时候未声名为临时函数的,都为永久函数,永久函数各个会话都可使用。

语法

CREATE FUNCTION [db_name.]function_name AS class_name
  [USING JAR|FILE|ARCHIVE 'file_uri' [, JAR|FILE|ARCHIVE 'file_uri'] ];

实例

create function czh3.itclj_udf_lower
  as 'com.itclj.hive.udf.ItcljUdf' 
  using jar 'hdfs:///user/itclj/hive-udf-demo-1.0.0.jar';

这样我们就用自己编写的自定义函数代码,在czh3这个库下面注册了一个itclj_udf_lower函数。

4、使用函数

函数全名是以 db_name.function_name表示,使用的时候可以直接写函数全名,如果函数在当前操作的库下面,使用函数的时候可以不写库名,直接写函数名即可。

select id,czh3.itclj_udf_lower(name) from czh3.itclj_09 limit 100 ; 

5、销毁函数

Drop [temporary] function [if exists] [dbname.]function_name;

6、重新加载函数

集群上有多个hiveServer2实例的时候,在一个hiveServer2实例上注册的UDF在另外一个hiveServer2实例上并不能马上看到新注册的实例,需要重新加载以刷新本实例的函数信息。
命令如下:

reload functions;

或者

reload function;

7、查看函数

show functions;

官方文档:https://cwiki.apache.org/confluence/display/Hive/HivePlugins

示例代码:https://github.com/clj198606061111/hive-udf-demo

你可能感兴趣的:(hive,hadoop,bigdata)