Table of Contents
几个重要概念
ObjectInspector
用于对象描述,实际上应该理解为对SQL一个字段属性的抽象?ConstantObjectInspector
用于描述常数字段的描述,可以通过方法getWritableConstantValue
获取到常数的值WritableConstantIntObjectInspector
整数
ObjectInspector 常用方法
- 创建基础类型的OI
PrimitiveObjectInspectorFactory.writableDoubleObjectInspector
- 创建复杂的OI
ArrayList<ObjectInspector> foi = new ArrayList<ObjectInspector>(); foi.add(PrimitiveObjectInspectorFactory.writableLongObjectInspector); foi.add(PrimitiveObjectInspectorFactory.writableDoubleObjectInspector); foi.add(PrimitiveObjectInspectorFactory.writableDoubleObjectInspector); ArrayList<String> fname = new ArrayList<String>(); fname.add("count"); fname.add("sum"); fname.add("variance"); ObjectInspectorFactory.getStandardStructObjectInspector(fname, foi);
- 利用
ObjectInspector
将Object
转换成基础类型
PrimitiveObjectInspectorUtils.getXXX(obj, oi)
- 区分
javaXXXObjectInspector
与writableXXXXObjectInspector
;
很简单 javaXXXObjectInspector
对应的是 Java原生的数据类型, 而 writableXXXXObjectInspector
对应 Hive 可序列化的数据类型。
以 javaStringObjectInspector
和 writableStringObjectInspector
为例,前者对应 String
而后者对应 Text
。
因此,如果你的UDF返回的是java原生类型,那么你的输出 ObjectInspector 必须是前者, 否则将会报错!