Hive自定义函数(generic)
来源:互联网 发布:网络婚恋诈骗广东 编辑:程序博客网 时间:2024/06/05 15:01
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;
- }
- }
- Hive自定义函数(generic)
- 自定义-Hive自定义函数
- Hive 自定义函数函数
- Hive 自定义函数函数
- Hive总结(十一)Hive自定义函数UDF
- Hive总结(十一)Hive自定义函数UDF
- Hive总结(十一)Hive自定义函数UDF
- Hive学习之自定义函数(UDF)
- Hive通用型自定义聚合函数(UDAF)
- HIVE 用户自定义函数(UDF)
- Hive通用型自定义聚合函数(UDAF)
- hive系列(2)---自定义函数UDF
- hive自定义函数(UDF和UDAF)
- HIVE中的自定义函数
- hive用户自定义函数
- HIVE中的自定义函数 .
- HIVE中的自定义函数
- HIVE 自定义函数 UDF
- C#快速开发PictureBox 图像控件
- 浅谈游戏中BOSS设计的思路
- 桶排序在海量数据中的应用
- X509证书--ANS1结构
- 区间第k小 分块
- Hive自定义函数(generic)
- Java数组的常用方法
- 【NOIP模拟考三】水资源——二分答案+Floyd验证 day1 first 信号连接
- ORA-00845: MEMORY_TARGET not supported on this system
- IntelliJ IDEA Maven项目下文件夹不能右键新建java文件等文件的解决办法
- 一个小问题:随机输出一个数组中全部数值?
- linux使用shell的基本功能
- HDU1257 最少拦截系统 DP(最大递增子序列)
- csv 按指定列顺序写入