Hive自定义generic(通用)函数,性能比simple性能高,同时能处理simple不能处理的问题,如:simple不能处理Hive的struct结构。
hive generic 函数详细见hive 目录:
src\ql\src\java\org\apache\hadoop\hive\ql\udf\generic
一、GenericUDF
1.UDF首先将输入数据转化为对应的ObjectInspectors对象
2.Hive自带的很多函数都是使用GenericUDF,例如:concat_ws, case when等等
3.UDF输入是单行数据,产生一个数据输出。
编写GenericUDF步骤:
1.继承GenericUDF类,实现以下3个方法:
public ObjectInspector initialize(ObjectInspector[] arguments) public Object evaluate(DeferredObject[] arguments) public String getDisplayString(String[] children)
2.initialize方法在SQL调用UDF函数中,首先被调用,它完成下面4件事:
(1)验证输入的类型是否预期输入
(2)设置返回值,设置返回一个与预期输出类型相符的ObjectInspector ,假设需要返回的是一个string类型,由于string类型对应的分布式类型是TextWritable,所以在initialize返回的类型是
return PrimitiveObjectInspectorFactory.writableStringObjectInspector;
(3)存储在全局变量的ObjectInspectors元素的输入
(4)设置存储变量的输出
其中第三步不是必须的,因为全局变量能在evaluate方法中以局部变量的形式声明并处理,但是在initialize存储全局变量,只需要初始化一次。
3.evaluate方法:处理函数从输入到输出的逻辑,返回函数处理预期结果的值
(1)第一步:将输入值,声明局部变量通过initialize方法判断合法的变量存储。
(2)第二步:处理函数逻辑,将输入通过代码逻辑得到结果并返回。
其中,Hive中的变量类型与Java中的变量类型的匹配:
hive类型 | java类型 |
array<> | ArrayList<> |
struct<> | Object |
其他类似于hadoop的变量类型,如:string对应hadoop 的TextWritable等等。
4.getDisplayString方法
(1)用于explain sql的时候,方便查看其返回的格式
(2)类似于java的toString方法
案例分析:
该案例实现,输入一个用户编号user_id,一个游戏列表game_list,输出是用户与随机游戏列表中的一款游戏,以逗号分隔:user_id,game,在hive外层使用split函数将其划分,得到用户随机的一款游戏。
源码分析:
import java.util.List; import org.apache.hadoop.hive.ql.exec.UDFArgumentException; import org.apache.hadoop.hive.ql.metadata.HiveException; import org.apache.hadoop.hive.ql.udf.generic.GenericUDF; import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector; import org.apache.hadoop.hive.serde2.objectinspector.StandardListObjectInspector; import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory; import org.apache.hadoop.io.Text; /** * 随机用户匹配游戏列表中的一款游戏 * * @author huzhirong * */ public class UDFRandomUidGame extends GenericUDF { //声明全局输入变量 StandardListObjectInspector dimGameListOI; ObjectInspector uidOI; //声明输出变量 private final Text text = new Text(); //处理业务逻辑 @Override public Object evaluate(DeferredObject[] vals) throws HiveException { text.clear(); Text uid = (Text) vals[0].get(); Text seq = new Text(","); @SuppressWarnings("unchecked") List<Text> list = (List<Text>) dimGameListOI.getList(vals[1].get()); Text game = list.get((int) (Math.random() * list.size())); text.append(game.getBytes(), 0, game.getLength()); text.append(seq.getBytes(), 0, seq.getLength()); text.append(uid.getBytes(), 0, uid.getLength()); return text; } //类似于java的toString方法,hive中在使用explain的时候调用该方法 @Override public String getDisplayString(String[] args) { StringBuilder sb = new StringBuilder(); if (args != null && args.length > 0) { for (String arg : args) { sb.append(arg).append(','); } } if (sb.length() > 0) { sb.setCharAt(sb.length() - 1, ')'); } else { sb.append(')'); } sb.insert(0, "random_list_element("); return sb.toString(); } @Override public ObjectInspector initialize(ObjectInspector[] ois) throws UDFArgumentException { uidOI = (ObjectInspector)ois[0]; dimGameListOI = (StandardListObjectInspector)ois[1]; //返回值类型 return PrimitiveObjectInspectorFactory.writableStringObjectInspector; } }
相关推荐
Spark不能使用hive自定义函数
简单介绍了hive自定义函数的编写步骤以及使用。
hive数仓、hive SQL 、 hive自定义函数 、hive参数深入浅出
hive自定义函数demo
Hive自定义函数 一. UDF(user defined function) 背景 系统内置函数无法解决所有的实际业务问题,需要开发者自己编写函数实现自身的业务实现诉求。 应用场景非常多,面临的业务不同导致个性化实现很多,故udf...
hive的udf函数实现
udf函数,用户自定义函数,可以直接在sql语句中计算的函数 优点: 允许实现模块化的程序设计、方便修改代码、增加函数 UDF的执行速度很快,通过缓存计划在语句重复执行时降低代码的编译开销,比存储方法的执行效率...
NULL 博文链接:https://chengjianxiaoxue.iteye.com/blog/2235666
hive-udfhive自定义函数主要实现hive3种自定义函数1,udf函数,主要用于处理一对一数据处理2,udtf函数,主要用于处理一对多数据处理2,udaf函数,主要用与处理多对一数据聚合处理
udf开发–做个简单脱敏udf保留前5位,后面全部替换成*****
hive常用内置函数使用文档,类似于java的api doc文档
hive常用函数大全,日期类别,函数类别等常用函数都可有;
地址转换成经纬度+两地址间距离计算+省市区位置解析(Java代码) Hive自定义函数的封装
hive窗口系列函数
05.hive中如何自定义函数--json解析函数示例.mp4
数据蛙hive窗口函数 - 精心总结
HIVE函数大全,包括目前HIVE可用的所有函数,里面有详细说明。HIVE是基于Hadoop的一个数据仓库工具,用来进行数据提取、转化、加载,这是一种可以存储、查询和分析存储在Hadoop中的大规模数据的机制。
自定义 hive udf udaf 有url解析,获取网站主域名,根据ip获取区域码,有rownum,列聚合以及一些业务实现udf。
hive-anttasks.jar hive-cli.jar hive-common.jar hive-contrib.jar hive-hbaseec.jar hive-hbase-handler.jar hive-hwi.jar hive-jdbc.jar hive-metastorejar hive-serde.jar hive-service.jar hive-shims.jar ...
Hive2.0函数大全(高清中文版)