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