在利用Hive或者Spark-sql进行数据分析任务时,经常会遇到一些Mysql等传统数据库中有的函数而hive中没有,或者需要自己定义一些复杂的字符串处理、复杂计算计算逻辑的时候,找不到可以用的Hive函数时。尽管可以编写一些map-reduce等程序来向集群提交任务,但毕竟不如操作SQL来爽快。为此,hive和Spark-sql都提供了一些接口类,我们基本这些接口类可以定义自己的Hive函数,并在SQL语句中使用

在此,简单的总结一下hive自定义函数的类型、编写、部署等内容 
Hive自定义函数: 
Hive自定义函数包括3中类型UDF、UDAF、UDTF,下面做一个简单的开发介绍。

UDF(user-defined function),普通的用户自定义函数,接受单行输入并产生单行输出。如字符串的大写转小写就输入这一类型。

编写UDF需要继承UDF类、并实现evaluate()方法

hive定位函数_Hive

UDAF(User-defined aggregate function:用户自定义聚合函数、接受多行输入并产生单行输出,如max、min都输入这一类。

编写UDAF稍微复杂一点,需要继承UDAF类,内部类实现UDAFEvaluator接口,实现 init()方法 完成参数的初始化,实现iterate()方法 接受输入,并进行内部轮转,实现terminatePartial()方法 返回子区域聚合结果,实现nerge()方法完成子区域结果的合并,实现terminate()返回最终聚合结果。

hive定位函数_自定义函数_02

UDTF(User-defined table-generating function):用户自定义表生成函数,接受单行输入并产生多行输出。 
继承org.apache.hadoop.hive.ql.udf.generic.GenericUDTF。 
实现initialize, process, close三个方法 
UDTF首先会调用initialize方法,此方法返回UDTF的返回行的信息(返回个数,类型)。初始化完成后,会调用process方法,对传入的参数进行处理,可以通过forword()方法把结果返回。最后close()方法调用,对需要清理的方法进行清理。 
写的一个用来切分”key:value;key:value;”这种字符串,返回结果为key, value两个字段

hive定位函数_自定义函数_03

Hive用户自定义函数的提交部署: 
编写好的UDF、UDAF、UDTF编译为jar包之后,需要提交给hive才能使用。提交包括3个过程:

  1. 通过命令行提交jar包: hive –auxpath /path/to/hive-examples.jar
  2. 注册临时函数: CREATE TEMPORARY FUNCTION maximum AS ‘Maximum’
  3. 使用自定义函数:select maximum(score) from score_table group by studentId