首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Hive之UDF

【导读:数据是二十一世纪的石油,蕴含巨大价值,这是·情报通·大数据技术系列第[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() 方法调用,对需要清理的方法进行清理。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20191227A0052100?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券