Hive—UDF函数编写

一、UDF函数

UDF(User-Defined Functions)即用户定义的hive函数。hive自带的函数并不能完全满足业务需求,这时就需要我们自定义函数。

二、分类

  1. UDF:one to one,进来一个出去一个,row mapping。是row级别操作,如:upper、substr函数
  2. UDAF:many to one,进来多个出去一个,row mapping。是row级别操作,如sum/min。
  3. UDTF:one to many ,进来一个出去多个。如alteral view与explode

三、编写方法

1)程序编写方法:

(1)继承org.apache.hadoop.hive.ql.UDF

(2)需要实现evaluate函数;evaluate函数支持重载;

(3)在hive的命令行窗口创建函数

注:UDF必须要有返回类型,可以返回null,但是返回类型不能为void;

2)Hive加载jar文件

(1)添加jar

  add jar linux_jar_path

(2)创建function

  create [temporary] function [dbname.]function_name AS class_name;

(3)在hive的命令行窗口删除函数

  Drop [temporary] function [if exists] [dbname.]function_name;

三、实例

1.eclipse建maven项目

2.导入依赖

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

3.编写一个测试函数

package com.atguigu.hive;

import org.apache.hadoop.hive.ql.exec.UDF;

public class Lower extends UDF {

    public String evaluate(final String s) {
        if (s == null) {
            return null;
        }
        return s.toLowerCase();
    }
}

4.export导出jar文件

5.将udf.jar上传至/opt/module/jars/目录。

6.将jar包添加到hive的classpath

hive (default)> add jar /opt/module/jars/udf.jar;
Added [/opt/module/jars/udf.jar] to class path
Added resources: [/opt/module/jars/udf.jar]

7.创建临时函数

hive (default)> create temporary function mylower as "com.atguigu.hive.Lower";
OK
Time taken: 1.06 seconds

temporary函数当前黑窗口有效,重新打开无效,提示以下错误。

hive (default)> select mylower(ename)  from emp;
FAILED: SemanticException [Error 10011]: Line 1:7 Invalid function 'mylower'
View Code

8.执行临时函数

hive (default)> select ename,mylower(ename) from emp;
OK
ename   _c1
SMITH   smith
ALLEN   allen
WARD    ward
JONES   jones
MARTIN  martin
BLAKE   blake
CLARK   clark
SCOTT   scott
KING    king
TURNER  turner
ADAMS   adams
JAMES   james
SMITH   smith
ALLEN   allen
WARD    ward
JONES   jones
MARTIN  martin
BLAKE   blake
CLARK   clark
SCOTT   scott
KING    king
TURNER  turner
ADAMS   adams
JAMES   james
Time taken: 1.07 seconds, Fetched: 24 row(s)

9.创建永久函数

(1)HDFS上创建路径

[ck@hadoop102 ~]$ dfs -mkdir -p /lib

(2)上传jar包到/lib路径

hive (default)> dfs -put /opt/module/jars/udf.jar /lib

(3)创建函数

hive (default)> create function mylower1 as 'com.atguigu.hive.Lower' using jar 'hdfs://hadoop102:9000/lib/udf.jar';

(4)在MySQL的metastore库中执行

select * from  FUNCS;

参考atguigu视频资料

原文地址:https://www.cnblogs.com/zs-chenkang/p/14445635.html