hive自定义自定义udf函数实战函数实战
一、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();