hive自定义函数

hive自定义函数:

UDF :User-Defined Function (用户自定义函数)一进一出
UDAF : User-Defined Aggregation Function(用户自定义聚合函数) 多进一出
UDTF : User-Defined Table-Generating Function(用户自定义表生成函数)一进多出

这里重点说一下自定义UDF的使用:
因为在使用hive清洗数据的时候可能会遇到数据倾斜,可以使用自定义udf函数对key进行处理,使其分散到多个reduce上

1.加入maven依赖
<dependency>
    <groupId>org.apache.hive</groupId>
    <artifactId>hive-exec</artifactId>
    <version>${hive.version}</version>
</dependency>
2.extends org.apache.hadoop.hive.ql.exec.UDF类,然后重写evaluate方法

public class UDFDemo extends UDF {
    //多个参数可以使用方法重载
    public String evaluate(String data1) {
        Random random = new Random();
        int num = random.nextInt(5);
        return num + "_" + data1;
    }
}

3.打包上传服务器
4.注册自定义udf函数:
(1)临时 : 注册后当前hive窗口有效,show funcations可以看到
hive (hwzhdb)> add jar /home/hadoop/jar/hadoop-1.0-SNAPSHOT.jar;

hive (hwzhdb)> CREATE TEMPORARY FUNCTION add_prefex AS "com.hwz.bigdata.UDFDemo";

hive (hwzhdb)> select add_prefex("a");
OK
_c0
1_a

删除临时函数:drop temporary function add_prefix;

(2)永久 : 注册后当前hive窗口关闭,重新打开也可以使用,show funcations看不到,但是可以在hive元数据中FUNCS表中看到

上传jar包到hdfs:
[hadoop@hadoop001 jar]$ hdfs dfs -put hadoop-1.0-SNAPSHOT.jar /jar

创建:
hive (hwzhdb)> CREATE FUNCTION add_prefix AS "com.hwz.bigdata.UDFDemo" USING JAR "hdfs://hadoop001:9000/jar/hadoop-1.0-SNAPSHOT.jar";

hive (hwzhdb)> select add_prefex("a");
OK
_c0
1_a
此时在show funcations看不到,可以去hive元数据中查看:
mysql> mysql> select * from funcs ;
+---------+-------------------------+-------------+-------+------------+-----------+------------+------------+
| FUNC_ID | CLASS_NAME              | CREATE_TIME | DB_ID | FUNC_NAME  | FUNC_TYPE | OWNER_NAME | OWNER_TYPE |
+---------+-------------------------+-------------+-------+------------+-----------+------------+------------+
|       1 | com.hwz.bigdata.UDFDemo |  1570745879 |     6 | add_prefix |         1 | NULL       | USER       |
+---------+-------------------------+-------------+-------+------------+-----------+------------+------------+
1 row in set (0.00 sec)


(3)启动hive即可使用:该方式需要重新编译hive,这里不做说明。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值