博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hive自定义函数
阅读量:6933 次
发布时间:2019-06-27

本文共 4190 字,大约阅读时间需要 13 分钟。

hot3.png

自定义函数包括三种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);        }    }}

部署运行

1).把程序打包放到目标机器上去

2).进入hive客户端,添加jar包:
hive> add jar /home/sfd/udf_test.jar
3).创建临时函数:
hive> create temporary function <函数名>
    > as 'java全类名';
4).销毁临时函数:
hive> drop temporary function <函数名>;

转载于:https://my.oschina.net/u/2000675/blog/749296

你可能感兴趣的文章
RxJava/RxAndroid : doAfterNext
查看>>
利用graphviz模块展示斐波那契数列的递归函数调用图(Python)
查看>>
标准模板库(STL)学习指南之map映射
查看>>
CentOS7.X的系统管理、安全设置及系统优化思路
查看>>
npm全局安装和本地安装和本地开发安装(npm install --g/--save/--save-dev)
查看>>
20个非常有用的Java程序片段
查看>>
喧喧发布 2.5.2 版本,主要修复已知问题
查看>>
人工智能技术在移动互联网发展中的应用
查看>>
微软开源 Quantum Katas,领先的量子编程解决方案
查看>>
PHP date函数参数详解
查看>>
DDoS攻击走向应用层
查看>>
智领新时代 慧享新生活 —— CITE2018新闻发布会在北京召开
查看>>
探秘区块链 - 头条新闻
查看>>
区块链应用 | 用区块链颠覆视频直播,与视频卡顿、缓冲说再见!
查看>>
Python的pyroute2网络模块
查看>>
从零开始学Win32平台缓冲区溢出(Part1)
查看>>
一朵为员工赋能的“美”云
查看>>
PostgreSQL Oracle 兼容性之 - PL/SQL DETERMINISTIC 与PG函数稳定性(immutable, stable, volatile)...
查看>>
万万想不到,你是这样的“闲鱼”!
查看>>
Logstash 推送告警到阿里钉钉(Dingtalk)
查看>>