5.1.7、Hive__自定义函数UDF(一进一出),UDAF(多进一出),UDTF(一进多出)

1、自定义函数的分类----表示输入输出的行数

UDF:一进一出
UDAF:多进一出
UDTF:一进多出

2、自定义函数UDF(一对一)参数给可变参数,进去多个还是出一个

(1)导包

<dependency>
     <groupId>org.apache.hive</groupId>
     <artifactId>hive-exec</artifactId>
     <version>1.2.1</version>
</dependency>

(2)定义一个类继承org.apache.hadoop.hive.ql.exec.UDF
(3)需要自定义函数evaluate写入实现逻辑

public class Demo03 extends UDF {
    //传入一个参数
    public String evaluate(String string){
        //加入处理的逻辑
        String s="start--"+string+"--end";
        return s;
    }
}

(4)将Java到吗打包上传到hadoop
(5)进入hive客户端,添加jar包: add jar /usr/local/data/hiveproject-1.0-SNAPSHOT.jar

(上一步打的Jar包)
(6)注册:创建临时函数,就是给定义的函数方法一个名字 hive> create temporary function a as ‘demo0
.Demo03’ (全类名)

3、UDTF自定义函数(一对多)

(1)定义类继承GenericUDTF,实现里面的方法
(2)java操作代码

public class Demo04UDTF extends GenericUDTF {
    /**
     * 初始化,将一行数据转换成列时,列的字段,类型等等信息
     * 数据输出的格式
     */
    @Override
    public StructObjectInspector initialize(StructObjectInspector argOIs) throws UDFArgumentException {
        //操作列的名称
        ArrayList<String> fileName = new ArrayList<String>();
        //操作列的类型
        ArrayList<ObjectInspector> fileType = new ArrayList<ObjectInspector>();
        fileName.add("x");
        fileType.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector);
        fileName.add("y");
        fileType.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector);
        return ObjectInspectorFactory.getStandardStructObjectInspector(fileName,fileType);
    }

    public void process(Object[] objects) throws HiveException {
        //传入的数据 k1:v1,k2:v2,k3:v3;
        String string = objects[0].toString();  //数据转换为string
        String[] split = string.split(","); //切一个一个kv
        for (String s : split) {
            String[] split1 = s.split(":"); //且一个一个元素k和v
           forward(split1);     //放入一个数组,输出
        }
    }

    public void close() throws HiveException {
        //关闭
    }
}

public class Demo05UDTF extends GenericUDTF {
    @Override
    public StructObjectInspector initialize(StructObjectInspector argOIs) throws UDFArgumentException {
        //操作列的名称
        ArrayList<String> fileName = new ArrayList<String>();
        //操作列的类型
        ArrayList<ObjectInspector> fileType = new ArrayList<ObjectInspector>();
        fileName.add("x");
        fileType.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector);
        return ObjectInspectorFactory.getStandardStructObjectInspector(fileName,fileType);
    }

    public void process(Object[] objects) throws HiveException {
        //输入数据为123,456,789
        String string = objects[0].toString();
        String[] split = string.split(",");
        for (String s : split) {
           //输出数据只能是数组
            String[] split1 = s.split(",");
            forward(split1);
        }
    }

    public void close() throws HiveException {

    }
}
上一篇:【题解】CF1416E Split


下一篇:telegraf 的influxdb和net配置