1、概述:
UDF操作作用于单个数据行,并且产生一个数据行作为输出。大多数函数都属于这一类(比如数学函数和字符串函数)。
UDF其实也可以完成iterate方法,虽然不能直接override,但是直接按照GenericUDAFEvaluator的方法名称写代码也是可以支持的。但是UDF不支持复杂类型的函数,GenericUDF可以支持如数组、列表array,map等复杂数据类型的输入输出。
UDAF 接受多个输入数据行,并产生一个输出数据行。像COUNT和MAX这样的函数就是聚集函数。
UDTF 操作作用于单个数据行,并且产生多个数据行-------一个表作为输出。
2、详细代码
类中定义 private ListObjectInspector arrayOI; private ObjectInspector arrayElementOI; private ArrayList<LongWritable> result;//返回值 init方法 arrayOI = (ListObjectInspector)parameters[2]; arrayElementOI = arrayOI.getListElementObjectInspector(); return ObjectInspectorFactory.getStandardListObjectInspector(PrimitiveObjectInspectorFactory.writableLongObjectInspector); iterate方法 Object array = parameters[2]; int arrayLength = arrayOI.getListLength(array); Object listElement = arrayOI.getListElement(array,i);
在sql调用的时候传入的类型是数组array(*,*),后台java接收的时候得到的是ArrayList<String>
3、hive 需要配置的代码
java 项目打包,jar
cmd>pscp 路径\文件名 root@IP:/文件路径
hive>add jar *.jar
ihve>create temporary funciton name as 'class路径+类名'