hive_UDTF函数
Posted maple-q
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hive_UDTF函数相关的知识,希望对你有一定的参考价值。
hive的UDTF函数是可以输入一行数据然后输出多行多列(可以是单行/单列)的函数
1 public class Tex extends GenericUDTF { 2 3 /** 4 * 对传入的参数进行初始化 5 * 判断参数个数/类型 6 * 初始化表结构 7 */ 8 @Override 9 public StructObjectInspector initialize(ObjectInspector[] argOIs) throws UDFArgumentException { 10 if (argOIs.length != 1) { 11 throw new UDFArgumentLengthException("actuly only one argument is expected"); 12 } 13 if (argOIs[0].getCategory() != ObjectInspector.Category.PRIMITIVE) { 14 throw new UDFArgumentTypeException(0, "type of String is expected but " + argOIs[0].getTypeName() + "is passed"); 15 } 16 17 //初始化表结构 18 //创建数组列表存储表字段 19 List<String> fieldNames = new LinkedList<String>(); 20 List<ObjectInspector> fieldios = new LinkedList<ObjectInspector>(); 21 22 //表字段 23 fieldNames.add("name"); 24 fieldNames.add("age"); 25 //表字段数据类型 26 fieldIOs.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector); 27 fieldIOs.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector); 28 29 //将表结构两部分聚合在一起 30 return ObjectInspectorFactory.getStandardStructObjectInspector(fieldNames, fieldIOs); 31 } 32 33 /** 34 * 对数据处理的代码 35 * 如果是多列的话,可以将每一行的数据存入数组中,然后将数组传入forward, 36 * forward每调用一次都会产生一行数据 37 */ 38 @Override 39 public void process(Object[] args) throws HiveException { 40 String str = args[0].toString(); 41 String[] splited = str.split(";"); 42 for (int i = 0; i < splited.length; i++) { 43 try { 44 String[] res = splited[i].split(","); 45 forward(res); 46 } catch (Exception e) { 47 continue; 48 } 49 50 } 51 } 52 53 //方法调用完毕时关闭方法 54 @Override 55 public void close() throws HiveException { 56 57 } 58 }
有一点问题:
之前添加的jar包没有清除处理的话,新添加的jar包如果依旧是之前的类的路径的话,创建的新函数会指向之前添加的jar包,导致修改后的代码函数无法生效;
我是暂时将类名改了,暂时不清楚怎么清除add添加的文件,找到后,完善
以上是关于hive_UDTF函数的主要内容,如果未能解决你的问题,请参考以下文章
在 Visual Studio 中创建构造函数的代码片段或快捷方式