hive自定义函数(UDF)

您所在的位置:网站首页 自定义udf函 hive自定义函数(UDF)

hive自定义函数(UDF)

2023-11-23 18:28| 来源: 网络整理| 查看: 265

概述

用户自定义函数(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



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3