HiveUDF的evaluate方法使用分析
文章目录
- 前言
- 分析
- 创建arguments
- 获得evaluate
- NumericOpMethodResolver
- DefaultUDFMethodResolver
- ComparisonOpMethodResolver
- 调用evaluate
- 示例
前言
工作中需要自己加载并使用Hive的UDF,于是学习了一下Hive的加载过程。
分析
创建arguments
org.apache.hadoop.hive.serde2.objectinspecto
r包下面有很多类包装不同类型的参数,在evaluate的时候需要使用
获得evaluate
Hive在GenericUDFBridge
的initialize(ObjectInspector[] arguments)
中通过argumentTypeInfos
获得UDF对应的evaluate
方法
argumentTypeInfos是由TypeInfoUtils根据argument获得
udf是根据className创建的,而className在构造方法当中被传入
getEvalMethod
方法在接口中没有实现,有三个子类实现了这一方法
NumericOpMethodResolver
获得了所有名为evaluate
的方法,然后再比较参数类型选出需要的
DefaultUDFMethodResolver
也是先获得evaluate
方法的列表,再找到参数类型匹配的方法
ComparisonOpMethodResolver
和上面差不多,主要是TypeInfo的处理不一样
调用evaluate
拿到匹配的方法后,可以通过FunctionRegistry调用invoke方法
convertIfNecessary方法会对参数进行一些转换
参数为DeferredObject,这是一种懒执行的策略
示例
这里只演示类型转换的示例
@Testpublic void testToObjectInspector() {System.out.println(HiveUtil.toObjectInspector("String", "str"));System.out.println(HiveUtil.toObjectInspector("Boolean", true));System.out.println(HiveUtil.toObjectInspector("Byte", (byte) 0));System.out.println(HiveUtil.toObjectInspector("Short", (short) 100));System.out.println(HiveUtil.toObjectInspector("Integer", 10000));System.out.println(HiveUtil.toObjectInspector("Long", 999999999L));System.out.println(HiveUtil.toObjectInspector("Float", (float) 1.0));System.out.println(HiveUtil.toObjectInspector("Double", 1.00000001));}
其中用到的HiveUtil如下
public class HiveUtil {private static final Map<String, TypeInfo> TYPE_INFO_MAP = new ConcurrentHashMap<>();static {TYPE_INFO_MAP.put("String", TypeInfoFactory.stringTypeInfo);TYPE_INFO_MAP.put("Boolean", TypeInfoFactory.booleanTypeInfo);TYPE_INFO_MAP.put("Byte", TypeInfoFactory.byteTypeInfo);TYPE_INFO_MAP.put("Short", TypeInfoFactory.shortTypeInfo);TYPE_INFO_MAP.put("Integer", TypeInfoFactory.intTypeInfo);TYPE_INFO_MAP.put("Long", TypeInfoFactory.longTypeInfo);TYPE_INFO_MAP.put("Float", TypeInfoFactory.floatTypeInfo);TYPE_INFO_MAP.put("Double", TypeInfoFactory.doubleTypeInfo);}public static ObjectInspector toObjectInspector(String dataType, Object data) {TypeInfo hiveType = TYPE_INFO_MAP.get(dataType);ConstantObjectInspector oi = ObjectInspectorUtils.getConstantObjectInspector(getStandardJavaObjectInspectorFromTypeInfo(hiveType), data);return ObjectInspectorUtils.getConstantObjectInspector(oi, data);}public static ObjectInspector[] toObjectInspectorArray(String[] dataTypes, Object[] datas) {ObjectInspector[] objectInspectors = new ObjectInspector[datas.length];for (int i = 0; i < datas.length; i++) {objectInspectors[i] = toObjectInspector(dataTypes[i], datas[i]);}return objectInspectors;}public static DeferredJavaObject toDeferredJavaObject(ObjectInspector oi) {return new DeferredJavaObject(ObjectInspectorUtils.getWritableConstantValue(oi));}public static DeferredObject[] toDeferredObjectArray(ObjectInspector[] objectInspectors) {DeferredJavaObject[] deferredJavaObjects = new DeferredJavaObject[objectInspectors.length];for (int i = 0; i < objectInspectors.length; i++) {deferredJavaObjects[i] = toDeferredJavaObject(objectInspectors[i]);}return deferredJavaObjects;}
}
HiveUDF的evaluate方法使用分析相关推荐
- 【Groovy】Groovy 脚本调用 ( Groovy 类中调用 Groovy 脚本 | 参考 Script#evaluate 方法 | 创建 Binding 对象并设置 args 参数 )
文章目录 一.Groovy 类中调用 Groovy 脚本 1.参考 Script#evaluate 方法分析 Groovy 类中调用 Groovy 脚本 2.创建 Binding 对象并设置 args ...
- 【Groovy】Groovy 脚本调用 ( Groovy 脚本中调用另外一个 Groovy 脚本 | 调用 evaluate 方法执行 Groovy 脚本 | 参数传递 )
文章目录 一.Groovy 脚本中调用另外一个 Groovy 脚本 1.调用 evaluate 方法执行 Groovy 脚本 2.参数传递 二.完整代码示例 1.调用者 Groovy 脚本 2.被调用 ...
- Puppeteer调用page对象evaluate方法产生的Execution context was destroyed错误处理
Execution context was destroyed产生的场景 在NodeJs中使用Puppeteer中Page对象的evaluate方法执行脚本,深入使用后一定遇到过Error: Exec ...
- C#中判断空字符串的3种方法性能分析【月儿原创】
C#中判断空字符串的3种方法性能分析 作者:清清月儿 主页:http://blog.csdn.net/21aspnet/ 时间:2007.4.28 3种方法分别是:string ...
- 对tableView三种计算动态行高方法的分析
tableView是一个神奇的东西,可以这么说,就算是一个初学者如果能把tableView玩的很6,那编一般的iOS的需求都问题不大了.tableView是日常开发中用烂了的控件,但是关于tableV ...
- python死锁案例_python避免死锁方法实例分析
本文实例讲述了python避免死锁方法.分享给大家供大家参考.具体分析如下: 当两个或者更多的线程在等待资源的时候就会产生死锁,两个线程相互等待. 在本文实例中 thread1 等待thread2释放 ...
- java to对象_java中同类对象之间的compareTo()和compare()方法对比分析
首先我们都知道java中的比较都是同一类对象与对象之间的比较,就好像现实生活中比较人和人的年龄一样,你不会去把人的年龄和人的身高来比较,这显然是没有意义的. java中同类对象之间的比较又分为两种,基 ...
- python怎么模拟浏览器交互_干货分享:python爬虫模拟浏览器的两种方法实例分析(赶紧收藏)...
今天为大家带来的内容是:干货分享:python爬虫模拟浏览器的两种方法实例分析(赶紧收藏) 文章主要介绍了python爬虫模拟浏览器的两种方法,结合实例形式分析了Python爬虫模拟浏览器的两种常见操 ...
- C#中判断空字符串的3种方法性能分析 1
C#中判断空字符串的3种方法性能分析 作者:杨义贤 主页:http://blog.csdn.net/lucky_yyx 时间:2007.4.29 3种方法分别是:string a=&qu ...
最新文章
- 201771010126 王燕《面向对象程序设计(Java)》第十四周学习总结(测试程序11)...
- c# is和as的区别
- Linux 检查域名服务,linux上的域名服务
- 如何使用SAP Cloud for Customer的Key User Tool将Mashup添加到UI上
- Quartz任务调度
- SQL Server 2005更改当前数据库的所有者
- 3项目里面全局用less变量 cli vue_Vue实战14——抽离全局less变量与Vuex持久化、多模块构建...
- Java:对于Borderlayout布局管理的理解
- win10 oracle安装
- 软件设计师真题知识点
- 高中时代的黑历史产物
- B. Neko Performs Cat Furrier Transform(思维题)
- Mysql5.7 的错误日志中最常见的note级别日志解释
- android 树莓派 图片,Android Things:树莓派3上手就是这么简单
- ssdt函数索引号_获得SSDT函数名和索引号的代码
- stm32过零检测电路
- 2020-12-03《Presto分布式SQL查询引擎——kkb笔记复习》
- WEB前端学习笔记-HTML
- 软件项目开发基本流程详解
- Nginx proxy_pass详解
热门文章
- 转义字符(转义序列)
- SteamVR 2.x 手柄射线与3D物体交互(9)
- 刚找到的OFFICESUITE V3.00注册码
- 策略模式 VS 状态模式
- 找个搞IOS逆向的大佬写个越狱插件,接单的联系,APP没加密,有可参照,有接单的大佬请联系下
- 物流配送问题遗传算法
- Cacti完全使用手册 ( 让你快速个性化使用Cacti )
- Python—数据分析与可视化编程
- 计算机系统配置有几方面要求,w7旗舰版系统配置要求有哪些_win7系统需要什么配置要求...
- iSee在第一年发展期间的败笔