2、Hive UDF编程实例
Hive的UDF包括3种:UDF(User-Defined Function)、UDAF(User-Defined Aggregate Function)和UDTF(User-Defined Table-Generating Function),Hive只支持Java编写UDF,其他的编程语言只能通过select transform转化为流来与Hive交互。
UDF(User-Defined Function):支持一个输入产生一个输出。继承自org.apache.hadoop.hive.ql.exec.UDF,并实现evaluate方法。
1、代码实现
import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.io.Text;
public class Lower2Upper extends UDF {
public Text evaluate(Text text,String up_low){
if(text==null){
return null;
}else if(up_low.equals("lowercase")){
return new Text(text.toString().toLowerCase());
}else if(up_low.equals("uppercase")){
return new Text(text.toString().toUpperCase());
}else{
return null;
}
}
}
2、打包,并放到hive所在的机器
3、进入hive的shell,用add jar命令把jar包导入到hive的环境变量中,用create temporary function as 命令基于jar包中的类创建临时函数。
hive>add jar /home/user/lowupper.jar;
hive>create temporary function lowupper as 'com.upit.hive.udf.Low2Upper';
hive>select lowupper(name,'uppercase') from userinfo;
4、销毁不再需要的函数
hive>drop temporary function lowupper;
注意:lowupper为临时的函数,所以每次进入都需要add jar以及create temporary操作。
UDAF(User-Defined Aggregate Function):支持多个输入一个输出。继承org.apache.hadoop.hive.ql.exec.UDAF类,实现org.apache.hadoop.hive.ql.exec.UDAFvaluator接口。UDAFvaluator接口有5个方法,分别如下:
- int 方法负责对中间结果实现初始化
- iterate 接收传入的参数,并进行内部的轮转,其返回类型为boolean
- terminaePartial 没有参数,负责返回iterate函数轮转后的数据
- merge 接收terminatePartial的返回结果,合并接收的蹭值,返回类型为boolean
- terminate 返回最终结果
import org.apache.hadoop.hive.ql.exec.NumericUDAF;
import org.apache.hadoop.hive.ql.exec.UDAFEvaluator;
import org.apache.hadoop.hive.serde2.io.DoubleWritable;
public class UDAFSum_Sample extends NumericUDAF {
public static class Evaluator implements UDAFEvaluator{
private boolean mEmpty;
private double mSum;
public Evaluator(){
super();
init();
}
@Override
public void init() {
mSum=0;
mEmpty=true;
}
public boolean iterate(DoubleWritable o){
if(o!=null){
mSum+=o.get();
mEmpty=false;
}
return true;
}
public DoubleWritable terminatePartial(){
return mEmpty?null:new DoubleWritable(mSum);
}
public boolean merge(DoubleWritable o){
if(o!=null){
mSum+=o.get();
mEmpty=false;
}
return true;
}
public DoubleWritable terminate(){
return mEmpty?null:new DoubleWritable(mSum);
}
}
}
关于UDAF开发应注意以下几点:
- import org.apache.hadoop.hive.ql.exec.UDAF以及org.apache.hadoop.hive.ql.exec.UDAFEvaluator包都是必需的。
- 函数类需要继承UDAF类,内部类Evaluator实现UDAFEvaluator接口。
- Evaluator需要实现init、iterate、terminatePartial、merge、terminate这几个函数。
- init函数类似于构造函数,用于UDAF的初始化。
- iterate接收传入的参数,并进行内部的轮转,其返回类型为boolean。
- terminatePartial无参数,其为iterate函数轮转结束后返回的轮转数据,iterate和terminatePartial类似于Hadoop的Combiner.
- merge接收terminatePartial的返回结果,进行数据merge操作,其返回类型为boolean。
- terminate返回最终的聚集函数结果。
UDTF(User-Defined Table-Generating Function):支持一个输入多个输出。
1、如何实现UDTF
继承org.apache.hadoop.hive.ql.udf.generic.GenericUDTF。
实现initialize, process, close三个方法
UDTF首先会调用initialize方法,此方法返回UDTF的返回行的信息(返回个数,类型)。初始化完成后,会调用process方法,对传入的参数进行处理,可以通过forword()方法把结果返回。最后close()方法调用,对需要清理的方法进行清理
2、实例
如下代码对形如key:value;key:value;格式的字符串分拆成key,value,返回结果为key, value两个字段
import java.util.ArrayList;
import org.apache.hadoop.hive.ql.udf.generic.GenericUDTF;
import org.apache.hadoop.hive.ql.exec.UDFArgumentException;
import org.apache.hadoop.hive.ql.exec.UDFArgumentLengthException;
import org.apache.hadoop.hive.ql.metadata.HiveException;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorFactory;
import org.apache.hadoop.hive.serde2.objectinspector.StructObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory;
public class ExplodeMap extends GenericUDTF {
@Override
public void close() throws HiveException {}
@Override
public StructObjectInspector initialize(ObjectInspector[] args)throws UDFArgumentException {
if (args.length != 1) {
throw new UDFArgumentLengthException("ExplodeMap takes only one argument");
}
if (args[0].getCategory() != ObjectInspector.Category.PRIMITIVE) {
throw new UDFArgumentException("ExplodeMap takes string as a parameter");
}
ArrayList<String> fieldNames = new ArrayList<String>();
ArrayList<ObjectInspector> fieldOIs = new ArrayList<ObjectInspector>();
fieldNames.add("col1");
fieldOIs.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector);
fieldNames.add("col2");
fieldOIs.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector);
return ObjectInspectorFactory.getStandardStructObjectInspector(fieldNames, fieldOIs);
}
@Override
public void process(Object[] args) throws HiveException {
String input = args[0].toString();
String[] test = input.split(";");
for (int i = 0; i < test.length; i++) {
try {
String[] result = test[i].split(":");
forward(result);
} catch (Exception e) {
continue;
}
}
}
}
3、 如何使用UDTF
3.1、在select中使用UDTF
select explode_map(properties) as (col1,col2) from my_table
不可以添加其他字段使用:select a, explode_map(properties) as (col1,col2) from my_table
不可以嵌套调用:select explode_map(explode_map(properties)) from my_table
不可以和group by/cluster by/distribute by/sort by一起使用:select explode_map(properties) as (col1,col2) from src group by col1, col2
3.2、结合lateral view使用
select src.id, mytable.col1, mytable.col2 from src lateral view explode_map(properties) mytable as col1, col2;
此方法更为方便日常使用。执行过程相当于单独执行了两次抽取,然后union到一个表里。
4、总结
使用lateral view之后,那么col1和col2相当于普通的列,可以参与查询,计算
2、Hive UDF编程实例的更多相关文章
- hive udf编程教程
hive udf编程教程 https://blog.csdn.net/u010376788/article/details/50532166
- HIVE: UDF应用实例
数据文件内容 TEST DATA HERE Good to Go 我们准备写一个函数,把所有字符变为小写. 1.开发UDF package MyTestPackage; import org.apac ...
- Hive UDF 用户自定义函数 编程及使用
首先创建工程编写UDF 代码,示例如下: 1. 新建Maven项目 udf 本机Hadoop版本为2.7.7, Hive版本为1.2.2,所以选择对应版本的jar ,其它版本也不影响编译. 2. po ...
- 2.13 Hive中自带Function使用及自定义UDF编程
UDF:User Definition Function 一.function #查看自带的函数 hive (db_hive)> show functions; #查看一个函数的详细用法 hiv ...
- HIVE udf实例
本例中udf来自<hive编程指南>其中13章自定义函数中一个例子. 按照步骤,第一步,建立一个项目,创建 GenericUDFNvl 类. /** * 不能接受第一个参数为null的情况 ...
- Hive UDF初探
1. 引言 在前一篇中,解决了Hive表中复杂数据结构平铺化以导入Kylin的问题,但是平铺之后计算广告日志的曝光PV是翻倍的,因为一个用户对应于多个标签.所以,为了计算曝光PV,我们得另外创建视图. ...
- PHP多进程编程实例
这篇文章主要介绍了PHP多进程编程实例,本文讲解的是在Linux下实现PHP多进程编程,需要的朋友可以参考下 羡慕火影忍者里鸣人的影分身么?没错,PHP程序是可以开动影分身的!想完成任务,又觉得一个进 ...
- c#摄像头编程实例 (转)
c#摄像头编程实例 摄像头编程 安装摄像头后,一般可以找到一个avicap32.dll文件 这是一个关于设想头的类 using system;using System.Runtime.Intero ...
- Hive UDF 实验1
项目中使用的hive版本低于0.11,无法使用hive在0.11中新加的开窗分析函数. 在项目中需要使用到row_number()函数的地方,有人写了udf来实现这个功能. new java proj ...
随机推荐
- 快速切题 sgu 112. a^b-b^a 大数 次方 难度:0 非java:1
112. a^b-b^a time limit per test: 0.25 sec. memory limit per test: 4096 KB You are given natural num ...
- vue 侧边导航栏递归显示
import axios from "axios"; import tabs1 from "../tab_content/tab1.vue"; import m ...
- JS中apply与call的用法
JavaScript中有一个call和apply方法,其作用基本相同,但也有略微的区别. 先来看看JS手册中对call的解释: call 方法调用一个对象的一个方法,以另一个对象替换当前对象. cal ...
- spring --解析自定义注解SpringAOP(配合@Aspect)
1:首先,声明自定义注解 @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.METHOD}) public @interface DtT ...
- 让nodejs在iis上运行
node在IIS上运行的好处: Tomasz的回答是我见过最棒的: 使用iisnode模块在IIS中托管node.js应用程序来取代自托管node.exe进程的优势在于: · 进程管理. Iisnod ...
- Python3 数字Number(六)
Python 数字数据类型用于存储数值. 数据类型是不允许改变的,这就意味着如果改变数字数据类型得值,将重新分配内存空间. 以下实例在变量赋值时 Number 对象将被创建: var1 = 1 var ...
- pdi vcard-2.1
vCard The Electronic Business Card Version 2.1 A versit Consortium Specification September 18, 1996 ...
- (转)使用Hive UDF和GeoIP库为Hive加入IP识别功能
Hive是基于Hadoop的数据管理系统,作为分析人员的即时分析工具和ETL等工作的执行引擎,对于如今的大数据管理与分析.处理有着非常大的 意义.GeoIP是一套IP映射数据库,它定时更新,并且提供了 ...
- RxJava 1.x 笔记:过滤型操作符
我真的是奇怪,上下班的路上看书.看文章学习的劲头特别大,到了周末有大把的学习时间,反而不珍惜,总想打游戏,睡前才踏踏实实地写了篇文章,真是服了自己! 本文内容为 RxJava 官方文档 学习笔记 作者 ...
- Java中高级面试题整理
一.基础知识: 1)集合类:List和Set比较,各自的子类比较(ArrayList,Vector,LinkedList:HashSet,TreeSet): 2)HashMap的底层实现,之后会问Co ...