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,这里不做说明。