1. 自定义函数

  1. UDF(User-Defined-Function)

    一进一出

  2. UDAF(User-Defined Aggregation Function)

    聚集函数,多进一出

    类似于:count/max/min

  3. UDTF(User-Defined Table-Generating Functions)

    一进多出

    如lateral view explore()

https://cwiki.apache.org/confluence/display/Hive/HivePlugins

2. 已过时都UDF方法

导入依赖

  1. <dependencies>
  2. <!-- https://mvnrepository.com/artifact/org.apache.hive/hive-exec -->
  3. <dependency>
  4. <groupId>org.apache.hive</groupId>
  5. <artifactId>hive-exec</artifactId>
  6. <version>3.1.2</version>
  7. </dependency>
  8. </dependencies>

继承UDF类 并书写extends方法

  1. package com.atguigu.hive;
  2. import org.apache.hadoop.hive.ql.exec.UDF;
  3. public class MyUDF extends UDF {
  4. //输入一个字符串 返回字符串长度 必须为evaluate这个方法名
  5. public int evaluate(String input) {
  6. if (input == null) {
  7. return 0;
  8. }
  9. return input.length();
  10. }
  11. }

打包成jar,再将jar包上传到hive中 /opt/module/hive/lib/

  1. cd /opt/module/hive/lib/

在hive中添加jar包 或者 重启hive 它会自动加载

  1. add jar /opt/module/hive/lib/hive_function-1.0-SNAPSHOT.jar; -- 添加jarclasspath
  2. create temporary function my_len as "com.atguigu.hive.MyUDF";
  3. -- create temporary function 自定义名称 as "自定义函数类路径"

使用时通过自定义的名称来使用

3. 新api

继承GenericUDF类 并重写抽象方法

package com.atguigu.hive;

import org.apache.hadoop.hive.ql.exec.UDFArgumentException;
import org.apache.hadoop.hive.ql.exec.UDFArgumentLengthException;
import org.apache.hadoop.hive.ql.exec.UDFArgumentTypeException;
import org.apache.hadoop.hive.ql.metadata.HiveException;
import org.apache.hadoop.hive.ql.udf.generic.GenericUDF;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory;

public class MyNewUDF extends GenericUDF {
    /**
     * 对输入的方法做检查 以及约束输出的类型
     * @param objectInspectors 输入参数的检查器
     * @return 输出的参数检查器
     * @throws UDFArgumentException
     */
    @Override
    public ObjectInspector initialize(ObjectInspector[] objectInspectors) throws UDFArgumentException {
        //长度检查
        if (objectInspectors.length !=1){
            throw  new UDFArgumentLengthException("Wrong arguments count!");
        }
        //类型检查
        if (!objectInspectors[0].getCategory().equals(ObjectInspector.Category.PRIMITIVE)){
            throw new UDFArgumentTypeException(0,"Wrong arguments type!");
        }
        return PrimitiveObjectInspectorFactory.javaIntObjectInspector; //返回java中int类型

    }

    /**
     * 实现逻辑的方法
     * @param deferredObjects
     * @return
     * @throws HiveException
     */
    @Override
    public Object evaluate(DeferredObject[] deferredObjects) throws HiveException {
        Object o = deferredObjects[0].get();
        if (o == null){
            return 0;
        }

        return o.toString().length();
    }

    /**
     * 函数执行出错 提示什么
     * @param strings
     * @return
     */
    @Override
    public String getDisplayString(String[] strings) {
        return "";
    }
}

打包上传hive lib中

create temporary function my_len as "com.atguigu.hive.MyNewUDF";

使用

select ename, my_len(ename) from emp;