目录

虽然Hive提供了很多函数,但是有些还是难以满足我们的需求。因此Hive提供了自定义函数开发,自定义函数包括三种UDF、UADF、UDTF

  • UDF(User-Defined-Function)
  • UDAF(User- Defined Aggregation Funcation)聚类函数(输入多行输出一行)
  • UDTF(User-Defined Table-Generating Functions) 输入一行输出多行(On-to-many maping)。
    开发UDF可以实现自己的需求

程序开发

注:自定义UDF需要继承org.apache.hadoop.hive.ql.UDF

  • 需要实现evaluate函数
  • evaluate函数支持重载
  • UDF只能实现一进一出的操作
    示例代码(例子是,查询当前row在趋势中的值):
import org.apache.hadoop.hive.ql.exec.UDF;
 
/**
 * 趋势
 */
public class UDFZNTrend extends UDF {
 
    /**
     * 前一个渠道+渠道
     */
    public String evaluate(String trendCon, String rowCon, String rowId) {
        String[] rows = rowCon.split(",");
        String[] trends = trendCon.split(",");
        if (rows.length > 1) {
            for (int i = 0; i < rows.length; i++) {
                if (rowId.equals(rows[i])) {
                    if (i > 0) {
                        return trends[i - 1] + "," + trends[i];
                    }
                    return trends[i];
                }
            }
            return null;
        }
        return trendCon;
    }
 
}

创建和使用函数

//进入hive客户端
hive>add jar /root/udf/UDFTrend.jar;//添加jar包
hive>create temporary function zntrend as 'com.hive.udf.UDFZNTrend'; //创建函数(全局有效,重启hive之后需要重新创建)
hive> DROP TEMPORARY FUNCTION zntrend;//销毁临时函数:
//查询HQL语句:
hive> SELECT zntrend("我,你,他","1,2,3",3) FROM hivetable limit 1;