HiveSQL实战积累_hiveUDF原理与使用&实现Bitmap
1.Hive的简单实现方法
简单实现方法步骤:
1.新建maven项目,在pom.xml文件中添加hiveUDF依赖:
1 | <dependency> |
2.新建UDF实现类继承UDF类,实现evaluate抽象方法:
1 | package hive.udf; |
3.打成jar包上传至hive的lib路径下,并赋权:
1 | [peizk@hadoop lib]$ chmod 777 UdfTest-1.0.jar |
4.进入hive客户端,执行添加jar包命令:
1 | hive (default)> add jar /home/peizk/app/hive-3.1.2/lib/UdfTest-1.0.jar; |
添加之后可以使用list jars查看添加的jar,确认是否添加成功:
1 | hive (default)> list jars; |
5.在hive客户端执行创建临时函数命令:
1 | hive (default)> create temporary function say_hello as "hive.udf.UDFHello"; |
6.在hiveSQL或者sparkSQL中使用该udf:
1 | hive (default)> select say_hello('peizk'); |
上述简单实现方法中,只是创建了临时函数,一旦退出hive客户端,再次进入hive客户端就没法儿再次使用该UDF函数了。如果想要一次添加多次使用可以通过两种方法实现:1.UDF函数注册到元数据,2.编译服务端源码。
2.商智常见使用方式
通常使用脚本的形式固化日常生产任务,一个脚本中就是一个日期动态的sql,那么直接将UDF jar包和生产脚本打包在一起,然后在生产脚本的sql中添加jar包并创建临时函数,然后使用UDF方法。
如下案例中编写了一个将真实数据进行指数化的UDF函数,用于进行真实数据脱敏,但是又能让下游进行趋势分析:
1 | #!/usr/bin/env python3 |
在sql逻辑前面根据jar在脚本中的路径添加jar包,并创建临时函数:add jar common/hive.jar; create temporary function tran_index as 'UDF.TranIndex';,然后就可以在后续sql中使用该临时函数tran_index(pv,17.37) as pv_index。
3.借助UDF实现Bitmap去重中间态
通过使用Bitmap、CPC存储不可加和指标的”中间态”,可以对明细数据进行提前聚合,帮助用户缩短数据提取时间周期,提升取数效率。
常见的用于支持Bitmap的hiveUDF:
| 函数类型 | 函数 | 功能 | 函数注册路径 |
|---|---|---|---|
| UDAF | union_exact_state | 精准中间态合并去重 | com.jd.sr.udf.state.hive.UnionExactStateUDAF |
| UDF | count_exact_state | 精准中间态转结果数值 | com.jd.sr.udf.state.hive.CountExactStateUDF |
| UDF | intersect_exact_state | 精准中间态求交集 | com.jd.sr.udf.state.hive.IntersectExactStateUDF |
| UDF | difference_exact_state | 精准中间态求差集 | com.jd.sr.udf.state.hive.ExactStateXorUDF |
| UDF | exact_state2value_array | 精准中间态还原原始值 | 如有需求可单独咨询 |
| UDAF | union_exact_state | 近似中间态合并去重 | com.jd.sr.udf.state.hive.UnionExactStateUDAF |
| UDF | count_exact_state | 近似中间态转结果数值 | com.jd.sr.udf.state.hive.CountExactStateUDF |
| UDAF | value2exact_state | 从数值生产精确中间态 | com.jd.sr.udf.state.hive.Value2ExactStateUDAF |
注意hive中存储中间态数据的字段类型为binary。
以下是一个从明细表生产中间态的示例:
1 | -- 注册UDF函数(使用Spark/Hive引擎) |
以下是一个从存储了中间态数据的表中提数的示例:
1 | -- 第一步注册UDF函数(使用Spark/Hive引擎) |