BigData|Hive自定义UDF函数


文章目录

  • 1.UDF函数分类
  • 2.自定义UDF函数
    • 2.1 导入Maven依赖
    • 2.1 编写自定义函数
    • 2.2 打包成jar并上传到hive所在服务器
    • 2.3 注册UDF函数
      • 2.3.1 临时注册
      • 2.3.2 删除临时注册函数
      • 2.3.3 永久注册
      • 2.3.4 删除永久注册函数

1.UDF函数分类 UDF : User-Defined Function (用户自定义函数)一进一出
UDAF : User-Defined Aggregation Function(用户自定义聚合函数) 多进一出
UDTF : User-Defined Table-Generating Function(用户自定义表生成函数)一进多出
2.自定义UDF函数 2.1 导入Maven依赖
org.apache.hive hive-exec ${hive.version}

2.1 编写自定义函数 自定义函数需要继承org.apache.hadoop.hive.ql.exec.UDF类,然后重写evaluate方法,这里写一个简单的给字段添加随机数字前缀的函数
package com.suddev.hadoop.hive; import org.apache.hadoop.hive.ql.exec.UDF; import java.util.Random; /** * @author Rand * @date 2019/10/4 0004 */ public class AddPrefixUDF extends UDF{ public String evaluate(String input) { Random random = new Random(); int num = random.nextInt(10); return num + "_" + input; } }

2.2 打包成jar并上传到hive所在服务器 此步略
2.3 注册UDF函数 注册函数分为两种方式:
  • 临时 : 只在当前hive窗口有效,窗口关闭,函数即被移除
  • 永久 : 当前hive窗口关闭,重新打开也可以使用
2.3.1 临时注册
1.添加jar到hive的classpath
hive> add jar /home/hadoop/lib/hadoop-learn-1.0.jar;

2.创建临时方法
语法: CREATE TEMPORARY FUNCTION 函数名 AS “自定义UDF函数类名”;
hive> CREATE TEMPORARY FUNCTION add_prefix AS "com.suddev.hadoop.hive.AddPrefixUDF";

3.测试
hive> select add_prefix('hello'); OK 2_hello Time taken: 0.054 seconds, Fetched: 1 row(s) # 使用show functions也能够查看到add_prefix函数 hive> show functions; OK ... add_prefix ...

退出hive重新进入
hive> quit; hive> show functions; OK # 此时已经看不到add_prefix函数了,可以看出刚才只是临时注册 ...

2.3.2 删除临时注册函数
hive> drop temporary function add_prefix; OK Time taken: 0.003 seconds

2.3.3 永久注册
1.将jar上传至HDFS
[hadoop@hadoop001 lib]$ hdfs dfs -put hadoop-learn-1.0.jar /lib/

2.永久注册函数
格式: CREATE FUNCTION 函数名 AS “自定义UDF函数类名” USING JAR “jar包所在hdfs路径”;
hive> CREATE FUNCTION add_prefix AS "com.suddev.hadoop.hive.AddPrefixUDF" USING JAR 'hdfs://hadoop001:9000/lib/hadoop-learn-1.0.jar'; converting to local hdfs://hadoop001:9000/lib/hadoop-learn-1.0.jar Added [/tmp/965db9b7-670e-4109-8891-e919c7d9a5aa_resources/hadoop-learn-1.0.jar] to class path Added resources: [hdfs://hadoop001:9000/lib/hadoop-learn-1.0.jar] OK Time taken: 0.169 seconds

3.测试
hive> select add_prefix('hello'); OK 5_hello Time taken: 0.566 seconds, Fetched: 1 row(s)

永久注册的函数使用show functions是不能够看到add_prefix函数的!!!!
hive> show functions; OK ... # add_prefix 没有这一行 ...

【BigData|Hive自定义UDF函数】但是我们进入mysql查看Hive元数据,在FUNCS表中能够查询到我们定义的函数信息
mysql> select * from FUNCS; +---------+-------------------------------------+-------------+-------+------------+-----------+------------+------------+ | FUNC_ID | CLASS_NAME| CREATE_TIME | DB_ID | FUNC_NAME| FUNC_TYPE | OWNER_NAME | OWNER_TYPE | +---------+-------------------------------------+-------------+-------+------------+-----------+------------+------------+ |1 | com.suddev.hadoop.hive.AddPrefixUDF |1570196465 |1 | add_prefix |1 | NULL| USER| +---------+-------------------------------------+-------------+-------+------------+-----------+------------+------------+ 1 row in set (0.00 sec)

2.3.4 删除永久注册函数
hive> drop function add_prefix; converting to local hdfs://hadoop001:9000/lib/hadoop-learn-1.0.jar Added [/tmp/e2820e2f-7852-4186-8f5e-5542b9bfe5ac_resources/hadoop-learn-1.0.jar] to class path Added resources: [hdfs://hadoop001:9000/lib/hadoop-learn-1.0.jar] OK Time taken: 3.14 seconds

    推荐阅读