文章目录
前言
工作中需要自己加载并使用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,这是一种懒执行的策略
示例
这里只演示类型转换的示例
@Test
public void testToObjectInspector() {
System.out.println(HiveUtil.toObjectInspector("String", "str"));
System.out.println(HiveUtil.toObjectInspector("Boolean", true));
System.out