这篇文章主要讲解了“UDF和UDAF开发方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“UDF和UDAF开发方法是什么”吧!
成都服务器托管,创新互联提供包括服务器租用、服务器托管、带宽租用、云主机、机柜租用、主机租用托管、CDN网站加速、申请域名等业务的一体化完整服务。电话咨询:18980820575
UDF自定义函数
自定义函数包括三种UDF、UDAF、UDTF
UDF(User-Defined-Function) 一进一出
UDAF(User- Defined Aggregation Funcation) 聚集函数,多进一出。Count/max/min
UDTF(User-Defined Table-Generating Functions) 一进多出,如lateral view explore()
使用方式 :在HIVE会话中add 自定义函数的jar文件,然后创建function继而使用函数
使用方式 :
在HIVE会话中add 自定义函数的jar文件,然后创建function,继而使用函数
UDF开发
1、UDF函数可以直接应用于select语句,对查询结构做格式化处理后,再输出内容。
2、编写UDF函数的时候需要注意一下几点:
a)自定义UDF需要继承org.apache.hadoop.hive.ql.UDF。
b)需要实现evaluate函数,evaluate函数支持重载。
3、步骤
a)把程序打包放到目标机器上去;
b)进入hive客户端,添加jar包:hive>add jar /run/jar/udf_test.jar;
c)创建临时函数:hive>CREATE TEMPORARY FUNCTION add_example AS 'hive.udf.Add';
d)查询HQL语句:
SELECT add_example(8, 9) FROM scores;
SELECT add_example(scores.math, scores.art) FROM scores;
SELECT add_example(6, 7, 8, 6.8) FROM scores;
e)销毁临时函数:hive> DROP TEMPORARY FUNCTION add_example;
注:UDF只能实现一进一出的操作,如果需要实现多进一出,则需要实现UDAF
udf实现对字符串的截取
package hive; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.apache.hadoop.hive.ql.exec.UDF; public class GetCmsID extends UDF{ public String evaluate(String url){ String cmsid = null; if(url ==null || "".equals(url)){ return cmsid; } Pattern pat = Pattern.compile("topicId=[0-9]+"); Matcher matcher = pat.matcher(url); if(matcher.find() ){ cmsid=matcher.group().split("topicId=")[1]; } return cmsid; } public String evaluate(String pattern,String url ){ String cmsid = null; if(url ==null || "".equals(url)){ return cmsid; } Pattern pat = Pattern.compile(pattern+"[0-9]+"); Matcher matcher = pat.matcher(url); if(matcher.find() ){ cmsid=matcher.group().split(pattern)[1]; } return cmsid; } public static void main(String[] args) { String url = "http://www.baidu.com/cms/view.do?topicId=123456"; GetCmsID getCmsID = new GetCmsID(); System.out.println(getCmsID.evaluate(url)); System.out.println(getCmsID.evaluate("topicId=",url)); } }
UDAF 自定义集函数
多行进一行出,如sum()、min(),用在group by时
1.必须继承
} org.apache.hadoop.hive.ql.exec.UDAF(函数类继承)
} org.apache.hadoop.hive.ql.exec.UDAFEvaluator(内部类Evaluator实现UDAFEvaluator接口)
2.Evaluator需要实现 init、iterate、terminatePartial、merge、terminate这几个函数
} init():类似于构造函数,用于UDAF的初始化
} iterate():接收传入的参数,并进行内部的轮转,返回boolean
} terminatePartial():无参数,其为iterate函数轮转结束后,返回轮转数据, 类似于hadoop的Combiner
} merge():接收terminatePartial的返回结果,进行数据merge操作,其返回类型为boolean
} terminate():返回最终的聚集函数结果
}开发一个功能同:
}Oracle的wm_concat()函数
}MySQL的group_concat()
package hive; import org.apache.hadoop.hive.ql.exec.UDAFEvaluator; public class Wm_concat { public static class myUDAFEval implements UDAFEvaluator{ private PartialResult partial = new PartialResult(); public static class PartialResult{ String result = ""; String delimiter = null; } @Override public void init() { partial.result =""; } public boolean iterate(String value ,String deli){ if(value == null || "null".equalsIgnoreCase(value)){ return true; } if(partial.delimiter == null){ partial.delimiter = deli; } if(partial.result.length()>0){ partial.result = partial.result.concat(partial.delimiter);//拼接 } partial.result = partial.result.concat(value);//拼接 return true; } public PartialResult terminatePartial(){ return partial; } public boolean merge(PartialResult other){ if(other == null ){ return true; } if (partial.delimiter == null) { partial.delimiter = other.result; partial.result = other.result; }else{ if (partial.result.length()>0) { partial.result = partial.result.concat(partial.delimiter); } partial.result = partial.result.concat(other.result); } return true; } public String terminate(){ if(partial==null || partial.result.length()==0){ return null; } return partial.result; } } }
测试:
create table test(id string , name string ) row format delimited fields terminated by '\t';
插入数据
1 a
1 b
2 b
3 c
1 c
2 a
4 b
2 d
1 d
4 c
3 b
在hive中执行函数如下
select id,concat(name,',') from wm_concat where id is not null group by id;
感谢各位的阅读,以上就是“UDF和UDAF开发方法是什么”的内容了,经过本文的学习后,相信大家对UDF和UDAF开发方法是什么这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是创新互联,小编将为大家推送更多相关知识点的文章,欢迎关注!