首页 > 技术文章 > hive_UDTF函数

maple-q 2019-10-06 16:49 原文

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添加的文件,找到后,完善

推荐阅读