一 写在前面
1 Hive的自定义函数(User-Defined Functions)分三类:
- UDF:one to one,进一出一,row mapping。是row级别操作,类似upper、substr等
- UDAF:many to one,进多出一,row mapping。是row级别操作,类似sum、min等
- UDTF:one to many ,进一出多。类似:alteral view与explode实现的一行变多行
2 实现自定义函数有两种方式:
- 通过jar包形式实现(java)
- 通过Transform关键字实现(支持多种语言,一般用Python)
Transform关键字实现 与 jar包形式实现 在不同场景下的性能不同。数据量较小时,大多数场景下
transform
有优势,而数据量大时jar包有优势在大数据量的场景下,Transform(Python)执行效率低的根本原因在于Python是直接向操作系统申请资源,而不是向YARN的ResourceManager申请资源,故而导致节点的资源无法高效组织和被利用。所以,不要轻易使用transform
接下来写一个统计统计字段长度的自定义函数
二 JAVA实现
0、基础信息
0.1 Hive有两个不同的接口编写UDF程序
一个是基础的UDF接口(org.apache.hadoop.hive.ql. exec.UDF) 可以处理基本类型的数据,如Text、IntWritable、LongWritable、DoubleWritable等
一个是复杂的GenericUDF接口(org.apache.hadoop.hive.ql.udf.generic.GenericUDF)可以处理Map、List、Set类型的数据
0.2 org.apache.hadoop.hive.ql. exec.UDF
只需要继承udf,然后实现evaluate()方法就行了
0.3 org.apache.hadoop.hive.ql.udf.generic.GenericUDF
至少需要实现以下三个方法
public ObjectInspector initialize(ObjectInspec