温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

UDF和UDAF开发方法是什么

发布时间:2021-12-30 14:18:40 来源:亿速云 阅读:170 作者:iii 栏目:云计算

这篇文章主要讲解了“UDF和UDAF开发方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“UDF和UDAF开发方法是什么”吧!

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()

UDF和UDAF开发方法是什么

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开发方法是什么”的内容了,经过本文的学习后,相信大家对UDF和UDAF开发方法是什么这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI