From: http://blog.csdn.net/dajuezhao/archive/2010/07/21/5753001.aspx
一、UDF
1、背景:Hive是基于Hadoop中的MapReduce,提供HQL查询的数据仓库。Hive是一个很开放的系统,很多内容都支持用户定制,包括:
a)文件格式:Text File,Sequence File
b)内存中的数据格式: Java Integer/String, Hadoop IntWritable/Text
c)用户提供的 map/reduce 脚本:不管什么语言,利用 stdin/stdout 传输数据
d)用户自定义函数: Substr, Trim, 1 – 1
e)用户自定义聚合函数: Sum, Average…… n – 1
2、定义:UDF(User-Defined-Function),用户自定义函数对数据进行处理。
二、用法
1、UDF函数可以直接应用于select语句,对查询结构做格式化处理后,再输出内容。
2、编写UDF函数的时候需要注意一下几点:
a)自定义UDF需要继承org.apache.hadoop.hive.ql.UDF。
b)需要实现evaluate函。
c)evaluate函数支持重载。
3、以下是两个数求和函数的UDF。evaluate函数代表两个整型数据相加,两个浮点型数据相加,可变长数据相加。
package hive.connect;
import org.apache.hadoop.hive.ql.exec.UDF;
public final class Add extends UDF {
public Integer evaluate(Integer a, Integer b) {
if (null == a || null == b) {
return null;
}
return a + b;
}
public Double evaluate(Double a, Double b) {
if (a == null || b == null)
return null;
return a + b;
}
public Integer evaluate(Integer... a) {
int total = 0;
for (int i = 0; i < a.length; i++)
if (a[i] != null)
total += a[i];
return total;
}
}
4、步骤
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;
5、细节在使用UDF的时候,会自动进行类型转换,例如:
SELECT add_example(8,9.1) FROM scores;
结果是17.1,UDF将类型为Int的参数转化成double。类型的饮食转换是通过UDFResolver来进行控制的。
三、UDAF
1、Hive查询数据时,有些聚类函数在HQL没有自带,需要用户自定义实现。
2、用户自定义聚合函数: Sum, Average…… n – 1
UDAF(User- Defined Aggregation Funcation)
四、用法
1、一下两个包是必须的import org.apache.hadoop.hive.ql.exec.UDAF和 org.apache.hadoop.hive.ql.exec.UDAFEvaluator。
2、函数类需要继承UDAF类,内部类Evaluator实UDAFEvaluator接口。
3、Evaluator需要实现 init、iterate、terminatePartial、merge、terminate这几个函数。
a)init函数实现接口UDAFEvaluator的init函数。
b)iterate接收传入的参数,并进行内部的轮转。其返回类型为boolean。
c)terminatePartial无参数,其为iterate函数轮转结束后,返回轮转数据,terminatePartial类似于hadoop的Combiner。
d)merge接收terminatePartial的返回结果,进行数据merge操作,其返回类型为boolean。
e)terminate返回最终的聚集函数结果。
4、以下为一个求平均数的UDAF:
package hive.udaf;
import org.apache.hadoop.hive.ql.exec.UDAF;
import org.apache.hadoop.hive.ql.exec.UDAFEvaluator;
public class Avg extends UDAF {
public static class AvgState {
private long mCount;
private double mSum;
}
public static class AvgEvaluator implements UDAFEvaluator {
AvgState state;
public AvgEvaluator() {
super();
state = new AvgState();
init();
}
/**
* init函数类似于构造函数,用于UDAF的初始化
*/
public void init() {
state.mSum = 0;
state.mCount = 0;
}
/**
* iterate接收传入的参数,并进行内部的轮转。其返回类型为boolean
*
* @param o
* @return
*/
public boolean iterate(Double o) {
if (o != null) {
state.mSum += o;
state.mCount++;
}
return true;
}
/**
* terminatePartial无参数,其为iterate函数轮转结束后,返回轮转数据,
* terminatePartial类似于hadoop的Combiner
*
* @return
*/
public AvgState terminatePartial() {// combiner
return state.mCount == 0 ? null : state;
}
/**
* merge接收terminatePartial的返回结果,进行数据merge操作,其返回类型为boolean
*
* @param o
* @return
*/
public boolean merge(AvgState o) {
if (o != null) {
state.mCount += o.mCount;
state.mSum += o.mSum;
}
return true;
}
/**
* terminate返回最终的聚集函数结果
*
* @return
*/
public Double terminate() {
return state.mCount == 0 ? null : Double.valueOf(state.mSum
/ state.mCount);
}
}
}
5、执行求平均数函数的步骤
a)将java文件编译成Avg_test.jar。
b)进入hive客户端添加jar包:
hive>add jar /run/jar/Avg_test.jar。
c)创建临时函数:
hive>create temporary function avg_test 'hive.udaf.Avg';
d)查询语句:
hive>select avg_test(scores.math) from scores;
e)销毁临时函数:
hive>drop temporary function avg_test;
五、总结
1、重载evaluate函数。
2、UDF函数中参数类型可以为Writable,也可为java中的基本数据对象。
3、UDF支持变长的参数。
4、Hive支持隐式类型转换。
5、客户端退出时,创建的临时函数自动销毁。
6、evaluate函数必须要返回类型值,空的话返回null,不能为void类型。
7、UDF是基于单条记录的列进行的计算操作,而UDFA则是用户自定义的聚类函数,是基于表的所有记录进行的计算操作。
8、UDF和UDAF都可以重载。
9、查看函数
SHOW FUNCTIONS;
DESCRIBE FUNCTION <function_name>;
10、wiki链接:http://wiki.apache.org/hadoop/Hive/LanguageManual/UDF
分享到:
相关推荐
- 对于复杂操作,考虑使用MapReduce或Spark等更底层的框架,而不是直接在UDF中实现。 - 测试UDF时,先在小规模数据上进行验证,确保正确性和性能。 综上所述,Hive UDF的开发和使用涉及到Java编程、Hive和Hadoop...
在Hive中,UDF分为三种类型:UDF(单行函数)、UDAF(累积聚合函数)和UDTF(多行转换函数)。在这里,我们只需要UDF,因为它适用于处理单行数据。 1. **编写Java类**: 要创建一个UDF,你需要编写一个Java类,该...
大数据的hive资源的详细代码设计以及分享,望博友相互交流
本文主要讲解了 Hive 中自定义 UDF 函数的编写方法,包括创建 UDF 类、实现自定义函数逻辑、编译和打包 UDF jar 包、上传至 Hive 服务器并注册自定义函数。 一、创建 UDF 类 为了实现自定义 UDF 函数,需要创建一...
在这个“hive-udf”项目中,我们主要探讨的是如何利用Java编写UDF来实现两个地址间的距离计算以及省市区位置的解析。 首先,地址转换成经纬度是计算距离的基础。地理坐标系统通常使用经度和纬度来定位地球上任意...
下面,我们将详细介绍如何使用Java编写hive的UDF,并将其部署到hive中。 UDF的概念 在hive中,UDF是用户自定义的函数,可以根据业务需求编写自定义的函数来实现特定的数据处理逻辑。UDF可以将复杂的数据处理逻辑...
Hive UDF(User Defined Functions)则是Hive中扩展其功能的关键部分,允许用户自定义函数来处理特定的数据分析任务。"dataiku hive udf"项目提供的是一套通用的Hive UDF源码,对于那些想深入开发Hadoop Hive应用的...
这是一些有用的 Hive UDF 和 UDAF 的集合。 提供的功能 UDAF Mode ( de.frosner.hive.udaf.Mode ) - 计算组列的统计模式 从源头构建 git clone https://github.com/FRosner/mustached-hive-udfs.git cd mustached...
Hive 支持多种类型的 UDF,包括普通函数(UDF)、聚合函数(UDAF)和表生成函数(UDTF)。UDF 允许用户扩展 Hive 的功能,处理特定的数据转换和计算任务。例如,你可以创建一个 UDF 来处理文本,如分词、去除停用词...
在“hive udaf 实现按位取与或”的场景中,我们主要探讨如何使用UDAF来实现数据的按位逻辑运算,如按位与(AND)和按位或(OR)。 一、Hive UDAF基本概念 UDAF是一种特殊的用户自定义函数,它负责处理一组输入值并...
内置聚合函数(UDAF)和表生成函数(UDTF)是Hive UDF中的高级功能。UDAF允许用户编写自定义的聚合逻辑,如自定义的count、sum、avg等;UDTF则允许用户将一行数据转换为多行数据,或者将多行数据合并为一行数据输出...
而自定义用户定义函数(UDF)是 Hive 中的一个重要功能,允许用户根据自己的需求编写自定义函数,以便在 Hive 查询中使用。 如何在 Hive 中创建自定义 UDF 函数: 步骤一:编写 Java 程序 首先,您需要编写一个 ...
NexR Hive UDF 关于 NexR Hive UDF是Hive用户定义功能的集合。 执照 快速开始 $ git clone https://github.com/nexr/hive-udf.git $ cd hive-udf $ mvn clean package or $ ant -Dhive.install.dir=../hive/build/...
* 脱敏UDF函数 * 功能:对一些敏感信息进行脱敏处理,替换方式可选择自定义替换,如'#','*'等,,如不指定脱敏符号,使用个随机字符替换 * 脱敏位置可自定义,不指定位置,会对数据进行全脱敏 * 例如身份证信息: ...
总结,通过自定义Hive UDF,我们可以方便地在Hive中实现Base64的加密和解密功能,从而满足大数据处理中的安全性和灵活性需求。这不仅可以用于数据传输的加密,还可以在数据分析过程中保护敏感信息,提高数据的安全性...
我们将涵盖正则表达式在手机号码清洗中的应用,以及如何编写和使用Java UDF在Hive和Impala中实现这个过程。 1. **手机号码格式问题**:手机号码可能因历史记录、输入错误或不同的国家/地区标准而呈现多种格式。例如...
根据功能不同,Hive UDF主要分为三类:基本UDF、通用UDF (GenericUDF) 和表生成UDF (UDTF)。 #### 三、Hive UDF开发步骤 ##### 3.1 创建Java程序 首先需要编写一个Java类,继承自`org.apache.hadoop.hive.ql.exec....
在本文中,我们将通过实例代码,详细介绍如何开发和使用 Java Hive UDF 函数。 UDF 函数的实现 首先,我们需要在 Maven 项目中添加依赖项,包括 Hadoop 和 Hive。 Maven 项目的 POM 文件如下所示: ```xml ...
hive_udf_处理JSON数组
Hive的UDF可以分为三类:UDF(单行)、UDAF(多行,聚合)和UDTF(多行到多行)。在这个例子中,我们讨论的是UDF,因为它处理单行数据。 在压缩包文件名`addmonth`中,我们可以猜测这个文件可能包含了实现月份加法...