文章目录

  • 前言
  • 分析
    • 创建arguments
    • 获得evaluate
      • NumericOpMethodResolver
      • DefaultUDFMethodResolver
      • ComparisonOpMethodResolver
    • 调用evaluate
  • 示例

前言

工作中需要自己加载并使用Hive的UDF,于是学习了一下Hive的加载过程。

分析

创建arguments

org.apache.hadoop.hive.serde2.objectinspector包下面有很多类包装不同类型的参数,在evaluate的时候需要使用

获得evaluate

Hive在GenericUDFBridgeinitialize(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方法使用分析相关推荐

  1. 【Groovy】Groovy 脚本调用 ( Groovy 类中调用 Groovy 脚本 | 参考 Script#evaluate 方法 | 创建 Binding 对象并设置 args 参数 )

    文章目录 一.Groovy 类中调用 Groovy 脚本 1.参考 Script#evaluate 方法分析 Groovy 类中调用 Groovy 脚本 2.创建 Binding 对象并设置 args ...

  2. 【Groovy】Groovy 脚本调用 ( Groovy 脚本中调用另外一个 Groovy 脚本 | 调用 evaluate 方法执行 Groovy 脚本 | 参数传递 )

    文章目录 一.Groovy 脚本中调用另外一个 Groovy 脚本 1.调用 evaluate 方法执行 Groovy 脚本 2.参数传递 二.完整代码示例 1.调用者 Groovy 脚本 2.被调用 ...

  3. Puppeteer调用page对象evaluate方法产生的Execution context was destroyed错误处理

    Execution context was destroyed产生的场景 在NodeJs中使用Puppeteer中Page对象的evaluate方法执行脚本,深入使用后一定遇到过Error: Exec ...

  4. C#中判断空字符串的3种方法性能分析【月儿原创】

    C#中判断空字符串的3种方法性能分析 作者:清清月儿 主页:http://blog.csdn.net/21aspnet/           时间:2007.4.28  3种方法分别是:string ...

  5. 对tableView三种计算动态行高方法的分析

    tableView是一个神奇的东西,可以这么说,就算是一个初学者如果能把tableView玩的很6,那编一般的iOS的需求都问题不大了.tableView是日常开发中用烂了的控件,但是关于tableV ...

  6. python死锁案例_python避免死锁方法实例分析

    本文实例讲述了python避免死锁方法.分享给大家供大家参考.具体分析如下: 当两个或者更多的线程在等待资源的时候就会产生死锁,两个线程相互等待. 在本文实例中 thread1 等待thread2释放 ...

  7. java to对象_java中同类对象之间的compareTo()和compare()方法对比分析

    首先我们都知道java中的比较都是同一类对象与对象之间的比较,就好像现实生活中比较人和人的年龄一样,你不会去把人的年龄和人的身高来比较,这显然是没有意义的. java中同类对象之间的比较又分为两种,基 ...

  8. python怎么模拟浏览器交互_干货分享:python爬虫模拟浏览器的两种方法实例分析(赶紧收藏)...

    今天为大家带来的内容是:干货分享:python爬虫模拟浏览器的两种方法实例分析(赶紧收藏) 文章主要介绍了python爬虫模拟浏览器的两种方法,结合实例形式分析了Python爬虫模拟浏览器的两种常见操 ...

  9. C#中判断空字符串的3种方法性能分析 1

    C#中判断空字符串的3种方法性能分析 作者:杨义贤 主页:http://blog.csdn.net/lucky_yyx       时间:2007.4.29  3种方法分别是:string a=&qu ...

最新文章

  1. 201771010126 王燕《面向对象程序设计(Java)》第十四周学习总结(测试程序11)...
  2. c# is和as的区别
  3. Linux 检查域名服务,linux上的域名服务
  4. 如何使用SAP Cloud for Customer的Key User Tool将Mashup添加到UI上
  5. Quartz任务调度
  6. SQL Server 2005更改当前数据库的所有者
  7. 3项目里面全局用less变量 cli vue_Vue实战14——抽离全局less变量与Vuex持久化、多模块构建...
  8. Java:对于Borderlayout布局管理的理解
  9. win10 oracle安装
  10. 软件设计师真题知识点
  11. 高中时代的黑历史产物
  12. B. Neko Performs Cat Furrier Transform(思维题)
  13. Mysql5.7 的错误日志中最常见的note级别日志解释
  14. android 树莓派 图片,Android Things:树莓派3上手就是这么简单
  15. ssdt函数索引号_获得SSDT函数名和索引号的代码
  16. stm32过零检测电路
  17. 2020-12-03《Presto分布式SQL查询引擎——kkb笔记复习》
  18. WEB前端学习笔记-HTML
  19. 软件项目开发基本流程详解
  20. Nginx proxy_pass详解

热门文章

  1. 转义字符(转义序列)
  2. SteamVR 2.x 手柄射线与3D物体交互(9)
  3. 刚找到的OFFICESUITE V3.00注册码
  4. 策略模式 VS 状态模式
  5. 找个搞IOS逆向的大佬写个越狱插件,接单的联系,APP没加密,有可参照,有接单的大佬请联系下
  6. 物流配送问题遗传算法
  7. Cacti完全使用手册 ( 让你快速个性化使用Cacti )
  8. Python—数据分析与可视化编程
  9. 计算机系统配置有几方面要求,w7旗舰版系统配置要求有哪些_win7系统需要什么配置要求...
  10. iSee在第一年发展期间的败笔