文档章节

hive,udf编写

n
 novas-meng
发布于 2015/03/05 10:58
字数 1344
阅读 110
收藏 0

Hive是一种构建在Hadoop上的数据仓库,Hive把SQL查询转换为一系列在Hadoop集群中运行的MapReduce作业,是MapReduce更高层次的抽象,不用编写具体的MapReduce方法。Hive将数据组织为表,这就使得HDFS上的数据有了结构,元数据即表的模式,都存储在名为metastore的数据库中。 可以在hive的外壳环境中直接使用dfs访问hadoop的文件系统命令。 Hive可以允许用户编写自己定义的函数UDF,来在查询中使用。Hive中有3种UDF: UDF:操作单个数据行,产生单个数据行; UDAF:操作多个数据行,产生一个数据行。 UDTF:操作一个数据行,产生多个数据行一个表作为输出。 用户构建的UDF使用过程如下: 第一步:继承UDF或者UDAF或者UDTF,实现特定的方法。 第二步:将写好的类打包为jar。如hivefirst.jar. 第三步:进入到Hive外壳环境中,利用add jar /home/hadoop/hivefirst.jar.注册该jar文件 第四步:为该类起一个别名,create temporary function mylength as 'com.whut.StringLength';这里注意UDF只是为这个Hive会话临时定义的。 第五步:在select中使用mylength(); 自定义UDF view sourceprint? 01.package whut; 02.import org.apache.commons.lang.StringUtils; 03.import org.apache.hadoop.hive.ql.exec.UDF; 04.import org.apache.hadoop.io.Text; 05.//UDF是作用于单个数据行,产生一个数据行 06.//用户必须要继承UDF,且必须至少实现一个evalute方法,该方法并不在UDF中 07.//但是Hive会检查用户的UDF是否拥有一个evalute方法 08.public class Strip extends UDF{ 09.private Text result=new Text(); 10.//自定义方法 11.public Text evaluate(Text str) 12.{ 13.if(str==null) 14.return null; 15.result.set(StringUtils.strip(str.toString())); 16.return result; 17.} 18.public Text evaluate(Text str,String stripChars) 19.{ 20.if(str==null) 21.return null; 22.result.set(StringUtils.strip(str.toString(),stripChars)); 23.return result; 24.} 25.} 注意事项: 1,一个用户UDF必须继承org.apache.hadoop.hive.ql.exec.UDF; 2,一个UDF必须要包含有evaluate()方法,但是该方法并不存在于UDF中。evaluate的参数个数以及类型都是用户自己定义的。在使用的时候,Hive会调用UDF的evaluate()方法。 自定义UDAF 该UDAF主要是找到最大值 view sourceprint? 01.package whut; 02.import org.apache.hadoop.hive.ql.exec.UDAF; 03.import org.apache.hadoop.hive.ql.exec.UDAFEvaluator; 04.import org.apache.hadoop.io.IntWritable; 05.//UDAF是输入多个数据行,产生一个数据行 06.//用户自定义的UDAF必须是继承了UDAF,且内部包含多个实现了exec的静态类 07.public class MaxiNumber extends UDAF{ 08.public static class MaxiNumberIntUDAFEvaluator implements UDAFEvaluator{ 09.//最终结果 10.private IntWritable result; 11.//负责初始化计算函数并设置它的内部状态,result是存放最终结果的 12.@Override 13.public void init() { 14.result=null; 15.} 16.//每次对一个新值进行聚集计算都会调用iterate方法 17.public boolean iterate(IntWritable value) 18.{ 19.if(value==null) 20.return false; 21.if(result==null) 22.result=new IntWritable(value.get()); 23.else 24.result.set(Math.max(result.get(), value.get())); 25.return true; 26.} 27. 28.//Hive需要部分聚集结果的时候会调用该方法 29.//会返回一个封装了聚集计算当前状态的对象 30.public IntWritable terminatePartial() 31.{ 32.return result; 33.} 34.//合并两个部分聚集值会调用这个方法 35.public boolean merge(IntWritable other) 36.{ 37.return iterate(other); 38.} 39.//Hive需要最终聚集结果时候会调用该方法 40.public IntWritable terminate() 41.{ 42.return result; 43.} 44.} 45.} 注意事项: 1,用户的UDAF必须继承了org.apache.hadoop.hive.ql.exec.UDAF; 2,用户的UDAF必须包含至少一个实现了org.apache.hadoop.hive.ql.exec的静态类,诸如常见的实现了 UDAFEvaluator。 3,一个计算函数必须实现的5个方法的具体含义如下: init():主要是负责初始化计算函数并且重设其内部状态,一般就是重设其内部字段。一般在静态类中定义一个内部字段来存放最终的结果。 iterate():每一次对一个新值进行聚集计算时候都会调用该方法,计算函数会根据聚集计算结果更新内部状态。当输入值合法或者正确计算了,则就返回true。 terminatePartial():Hive需要部分聚集结果的时候会调用该方法,必须要返回一个封装了聚集计算当前状态的对象。 merge():Hive进行合并一个部分聚集和另一个部分聚集的时候会调用该方法。 terminate():Hive最终聚集结果的时候就会调用该方法。计算函数需要把状态作为一个值返回给用户。 4,部分聚集结果的数据类型和最终结果的数据类型可以不同。

© 著作权归作者所有

上一篇: hive 桶的理解
下一篇: linux awk命令学习
n
粉丝 0
博文 3
码字总数 2170
作品 0
哈尔滨
私信 提问
hive利器 自定义UDF+重编译hive

用hive也有一段时间里,不过一直没写过相关到日志,因为主要用hive也无非是create table,upload data,CRUD 这几个过程。后来工作中需要用到一些常用到方法,了解到hive中支持UDF(User Defi...

王二铁
2012/06/28
0
3
Hadoop Hive概念学习系列之hive里的用户定义函数UDF

Hive可以通过实现用户定义函数(User-Defined Functions,UDF)进行扩展(事实上,大多数Hive功能都是通过扩展UDF实现的)。想要开发UDF程序,需要继承org.apache.hadoop.ql.exec.UDF类,并重...

sjyttkl
2018/04/22
0
0
Impala安装json解析udf插件

背景 Impala跟Hive一样,是常用的数据仓库组件之一。熟悉Hive的同学肯定知道,Hive官方提供了getjsonobject函数用于处理json字符串,但是Impala官方并没有提供类似的方法,好在是有第三方实现...

wooyoo
2017/04/18
0
0
编写hive udf函数

udf编写入门 大写转小写 package com.afan; import org.apache.hadoop.hive.ql.exec.UDF; import org.apache.hadoop.io.Text; public class UDFLower extends UDF{ public Text evaluate(fin......

SimplePoint
2017/02/14
0
0
利用eclipse编写自定义hive udf函数

在做日志分析的过程中,用到了hadoop框架中的hive,不过有些日志处理用hive中的函数处理显得力不从心,就需要用udf来进行扩展处理了 1 在eclipse中新建java project hiveudf 然后新建class p...

大数据之路
2012/10/21
0
0

没有更多内容

加载失败,请刷新页面

加载更多

tomcat 莫名奔溃问题

Apr 24, 2019 6:18:11 PM org.apache.coyote.AbstractProtocol pause INFO: Pausing ProtocolHandler ["http-nio-8080"] Apr 24, 2019 6:18:12 PM org.apache.coyote.AbstractProtocol pause......

mellen
14分钟前
0
0
组件开发规范 class名身份识别

组件需要通过一个组件共有的class来标识这个组件,外部调用的时候,可以通过锁定这个class来方便地改变组件的css样式。 设置方式 .my-checkbox { width: 20px; height: 20px; font-...

Carbenson
22分钟前
0
0
如何在工作中快速成长?致工程师的10个简单技巧

阿里妹导读:阿里有句非常经典的土话,“今天的最好表现,是明天的最低要求。”如何挖掘潜能、发现更好的自己?今天,阿里巴巴高级无线开发专家江建明将认知升级的方法总结出来,帮助你获得快...

阿里云云栖社区
41分钟前
2
0
PHP和Redis实现在高并发下的抢购及秒杀功能

抢购、秒杀是平常很常见的场景,面试的时候面试官也经常会问到,比如问你淘宝中的抢购秒杀是怎么实现的等等。 抢购、秒杀实现很简单,但是有些问题需要解决,主要针对两个问题: 一、高并发对...

xiaogg
43分钟前
1
0
从数据上看:谁才是漫威的绝对C位

复联4上映了!这次比美国还早了两天。当然,我还没看,不会给你们剧透,当然也不想不剧透。 这一部不仅是灭霸这一线剧情的结局,也被认为漫威第三阶段的收官之作。据说此部之后,不少影迷熟知...

crossin
56分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部