【导读:数据是二十一世纪的石油,蕴含巨大价值,这是·情报通·大数据技术系列第[26]篇文章,欢迎阅读和收藏】
1基本概念
UDF的全称为 user-defined function ,是一个允许用户扩展 HiveQL 的强大的功能。用户可以使用 Java 编写自己的 UDF ,每一种都会针对输入数据执行特定 “ 一类 ” 的转换过程。为什么有它的存在呢?有的时候你要写的查询无法轻松地使用 Hive 提供的内置函数来表示,通过写 UDF , Hive 就可以方便地插入用户写的处理代码并在查询中使用它们,相当于在 HQL ( Hive SQL )中自定义一些函数。
2术语解释
Hive中有三种 UDF:( 普通 )UDF 、用户定义聚集函数( user-defined aggregate function , UDAF )、用户定义表生成函数( user-defined table-generating function , UDTF )。
UDF操作作用于单个数据行,并且产生一个数据行作为输出。大多数函数都属于这一类(比如数学函数和字符串函数)。
UDAF接受多个输入数据行,并产生一个输出数据行。例如 COUNT 和 MAX 这样的函数就是聚集函数。
UDTF操作作用于单个数据行,并且产生多个数据行 ------- 一个表作为输出
3UDF函数满足的条件
3.1UDF函数
1、 UDF 函数可以直接应用于 select 语句,对查询结构做格式化处理后,再输出内容。
2、编写 UDF 函数的时候需要注意一下几点:
b )需要实现 evaluate 函数, evaluate 函数支持重载。
例:写一个返回字符串长度的 Demo:
public class GetLength extends UDF{
public int evaluate(String str) {
try{
return str.length();
}catch(Exception e){
return -1;
}
}
}
3、步骤
a )把程序打包放到目标机器上去;
如果想在 Hive 中使用 UDF ,那么需要将 Java 代码进行编译,然后将编译后的 UDF 二进制类文件打包成一个 JAR 文件。如下步骤:
1)右键项目,选择 Export ;选择导出格式为 JAR file 格式:
2)点击 Next ,选择要导出的项目,以及填写导出的目录:
3)点击 Finish 完成。
b )进入 hive 客户端,添加 jar 包:
hive> add jar /root/hive_udf.jar
c )创建临时函数:
d )查询 HQL 语句:
hive> select getLen(info) from apachelog;
OK
60
29
87
Time taken: 0.072 seconds, Fetched: 9 row(s)
e )销毁临时函数:
hive> DROP TEMPORARY FUNCTION getLen;
3.2UDAF计算函数
1 、必须继承
2、 Evaluator 需要实现 init 、 iterate 、 terminatePartial 、 merge 、 terminate 这几个函数
init(): 类似于构造函数,用于 UDAF 的初始化
iterate(): 接收传入的参数,并进行内部的轮转,返回 boolean
terminatePartial(): 无参数,其为 iterate 函数轮转结束后,返回轮转数据,类似于 hadoop 的 Combiner
merge(): 接收 terminatePartial 的返回结果,进行数据 merge 操作,其返回类型为 boolean
terminate(): 返回最终的聚集函数结果
3、UDTF有两种使用方法:一种直接放到 select 后面,一种和 lateral view 一起使用。
3.3UDTF计算函数
UDTF(User-Defined Table-Generating Functions)用来解决 输入一行输出多行 (On-to-many maping) 的需求。
UDTF首先会调用 initialize 方法,此方法返回 UDTF 的返回行的信息(返回个数,类型)。
初始化完成后,会调用 process 方法 , 真正的处理过程在 process 函数中,在 process 中,每一次 forward() 调用产生一行;如果产生多列可以将多个列的值放在一个数组中,然后将该数组传入到 forward() 函数。
最后 close() 方法调用,对需要清理的方法进行清理。
领取专属 10元无门槛券
私享最新 技术干货