一、UDF相关概念
- udf函数,用户自定义函数,可以直接在sql语句中计算的函数
优点:
- 允许实现模块化的程序设计、方便修改代码、增加函数
- UDF的执行速度很快,通过缓存计划在语句重复执行时降低代码的编译开销,比存储方法的执行效率更高
- 可用于减少网络流量
- UDF放入内存中,设计不当可能导致系统的崩溃,所以必须在必要的时候实施优化,对udf的优化是通过改写原来的udf代码实现,主要包括两种场景
- 如果udf嵌套复杂,可以重写一个嵌套层数较少且可以实现相同功能的udf,使性能成倍提升
- 针对过滤类的udf,将过滤率高的放在前面,减少中间结果,避免不必要的计算
二、UDF的使用
1、建hive表
create table xcj_udf_test(jsonStr string);
2、准备数据
{"movie":"1193","rate":"5","timeStamp":"978300760","uid":"1"}
{"movie":"661","rate":"3","timeStamp":"978302109","uid":"1"}
{"movie":"914","rate":"3","timeStamp":"978301968","uid":"1"}
{"movie":"3408","rate":"4","timeStamp":"978300275","uid":"1"}
{"movie":"2355","rate":"5","timeStamp":"978824291","uid":"1"}
{"movie":"1197","rate":"3","timeStamp":"978302268","uid":"1"}
{"movie":"1287","rate":"5","timeStamp":"978302039","uid":"1"}
3、加载数据
load data local inpath '/data/xuecj02/hive/data.txt' into table xcj_udf_test;
4、查询数据
select * from xcj_udf_test;
5、查看表结构
desc xcj_udf_test;
6、将 jar 包添加到 hive 的 classpath
add jar hdfs://HDFS****/data/xuecj02/hive/hive-udf-test.jar;
7、创建临时函数
create temporary function udf_test as 'com.missfresh.udf.MyUdfTest';
8、使用
select udf_test(jsonStr,'rate') from tmp.xcj_udf_test;
9、udf代码
import com.alibaba.fastjson.JSONObject;
import org.apache.commons.lang.StringUtils;
import org.apache.hadoop.hive.ql.exec.UDF;
public class MyUdfTest extends UDF {
public String evaluate(String jsonStr, String objName) throws IOException {
/**
*isEmpty isBlank的区别
* 1、isEmpty没有忽略空格参数,是以是否为空和是否存在为判断依据
* 2、isBlank是在isEmpty的基础上进行了为空(字符串都为空格,制表符,tab的情况)判断,比较常用
*/
if (StringUtils.isBlank(jsonStr) || StringUtils.isBlank(objName)) {
return null;
}
JSONObject jsonObject = JSONObject.parseObject(jsonStr);
Object objValue = jsonObject.get(objName);
if (objValue == null) {
return null;
}
return objValue.toString();
}
}
三、临时函数和永久函数
临时函数
- 添加jar包
add jar hdfs://HDFS****/data/xuecj02/hive/hive-udf-test.jar;
- 创建临时函数
语法:CREATE TEMPORARY FUNCTION function_name AS class_name;
function_name函数名
class_name 类路径,包名+类名
create temporary function udf_test as 'com.missfresh.udf.MyUdfTest';
- 查看函数列表
Show functions;
- 测试使用
select udf_test(jsonStr,'rate') from tmp.xcj_udf_test;
永久函数
- 创建永久函数语法
CREATE FUNCTION [db_name.]function_name AS class_name [USING JAR|FILE|ARCHIVE 'file_uri' [, JAR|FILE|ARCHIVE 'file_uri'] ];
file_uri:是hdfs上的jar包目录
- 创建函数
CREATE FUNCTION sayhello AS 'com.missfresh.udf.MyUdfTest' USING JAR 'hdfs://*****/data/xuecj02/hive/hive-udf-test.jar';
3、查看函数列表
Show functions;
4、测试使用
select udf_test(jsonStr,'rate') from tmp.xcj_udf_test;