hive如何自定义函数

这篇文章主要为大家展示了“hive如何自定义函数”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“hive如何自定义函数”这篇文章吧。

成都创新互联秉承实现全网价值营销的理念,以专业定制企业官网,成都网站制作、网站设计、外贸网站建设重庆小程序开发,网页设计制作,手机网站开发,全网营销推广帮助传统企业实现“互联网+”转型升级专业定制企业官网,公司注重人才、技术和管理,汇聚了一批优秀的互联网技术人才,对客户都以感恩的心态奉献自己的专业和所长。

自定义函数包括三种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继而使用函数

UDF

这是普通的用户自定义函数。接受单行输入,并产生单行输出。
1、UDF函数可以直接应用于select语句,对查询结构做格式化处理后,再输出内容。
2、编写UDF函数的时候需要注意一下几点:
a)自定义UDF需要继承org.apache.hadoop.hive.ql.UDF。
b)需要实现evaluate函数,evaluate函数支持重载。
注: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

用户定义聚集函数(User-defined aggregate function)。接受多行输入,并产生单行输出。比如MAX,COUNT函数。

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():无参数,函数在部分聚合完成后被调用。当hive希望得到部分记录的聚合结果时,此函数被调用。
merge():接收terminatePartial的返回结果,用于合并先前得到的部分聚合结果(也可以理解为分块记录的聚合结果),其返回类型为boolean
terminate():返回最终的聚集函数结果

merge的输入参数类型和terminatePartial函数的返回值类型必须是一致的。

packagecom.oserp.hiveudf;
importorg.apache.hadoop.hive.ql.exec.UDAF;
importorg.apache.hadoop.hive.ql.exec.UDAFEvaluator;
importorg.apache.hadoop.hive.serde2.io.DoubleWritable;
importorg.apache.hadoop.io.IntWritable;

public class HiveAvg extends UDAF { 
    public static class AvgEvaluate implements UDAFEvaluator
    {
        public static class PartialResult
        {
            public intcount;
            public doubletotal;             
            public PartialResult()
            {
                count = 0;
                total = 0;
            }
        }      
        private PartialResult partialResult;  
        @Override
        public void init() {
            partialResult = new PartialResult();
        }      
        public boolean iterate(IntWritable value)

        {              

            // 此处一定要判断partialResult是否为空,否则会报错

            // 原因就是init函数只会被调用一遍,不会为每个部分聚集操作去做初始化

            //此处如果不加判断就会出错

            if (partialResult==null)
            {
                partialResult =new PartialResult();
            }       

            if (value !=null)
            {
                partialResult.total =partialResult.total +value.get();
                partialResult.count=partialResult.count + 1;
            }
            return true;          
        }
        public PartialResult terminatePartial()
        {
            returnpartialResult;
        }
        public boolean merge(PartialResult other)
        {  
            partialResult.total=partialResult.total + other.total;
            partialResult.count=partialResult.count + other.count;        
            return true;
        }
        public DoubleWritable terminate()
        {
            return newDoubleWritable(partialResult.total /partialResult.count);

        }

    }

}

hive如何自定义函数

部署运行

1).把程序打包放到目标机器上去
2).进入hive客户端,添加jar包:
hive> add jar /home/sfd/udf_test.jar
3).创建临时函数:
hive> create temporary function <函数名>
    > as 'java全类名';
4).销毁临时函数:
hive> drop temporary function <函数名>;

以上是“hive如何自定义函数”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注创新互联行业资讯频道!


文章名称:hive如何自定义函数
网页链接:http://azwzsj.com/article/pehhde.html