首页 > 技术文章 > Hive 自定义函数

noyouth 2020-04-22 22:03 原文

准备工作,创建工程,添加jar

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

一、udf函数

1.编写自定义函数。

①继承UDF,添加evaluate方法,虽然不是实现也不是重写,但是方法名必须叫evaluate。

②此evaluate方法可以重载。

public class MyUDF extends UDF {

    public int evaluate(int data){
        return data + 5;
    }
}

2.打包,上传到服务器,hive的lib目录下。

3.将jar包添加到hive的classpath。

hive (default)> add jar /opt/module/hive/lib/hive-udf-1.0-SNAPSHOT.jar;

4.创建(临时)函数与java类关联。生产环境要指定函数所在的库名。

语法:create [temporary] function [dbname.]function_name AS class_name;

hive (default)> create temporary function addFive as "com.atguigu.udf.MyUDF";

5.使用自定义函数。

hive (default)> select addFive(2);
OK
_c0
7

 

二、udtf函数

编写自定义函数,其他步骤与上同。

public class MyUDTF extends GenericUDTF {

    private List<String> dataList = new ArrayList<>();

    @Override
    public StructObjectInspector initialize(StructObjectInspector argOIs) throws UDFArgumentException {

        //1.自定义列名集合
        List<String> fieldNames = new ArrayList<>();
        fieldNames.add("lineToWord");

        //2.输出数据的类型
        List<ObjectInspector> fieldOIs = new ArrayList<>();
        fieldOIs.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector);
        return ObjectInspectorFactory.getStandardStructObjectInspector(fieldNames, fieldOIs);
    }

    //函数的参数被封装为一个数组
    @Override
    public void process(Object[] objects) throws HiveException {
        //获取数据
        String data = objects[0].toString();

        //获取分隔符
        String splitKey = objects[1].toString();

        //切分数据
        String[] words = data.split(splitKey);

        //遍历写出
        for (String word : words) {
            dataList.clear();
            dataList.add(word);
            forward(dataList);
        }

    }

    @Override
    public void close() throws HiveException {

    }
}

 

推荐阅读