UDF步骤:
UDF(User-Defined-Function) 用来解决 一行输入一行输出(On-to-On maping) 的需求。1.继承org.apache.hadoop.hive.ql.exec.UDF2.实现evaluate函数,evaluate函数支持重载
- package cn.sina.stat.hive.udf;
- import java.util.Arrays;
- import org.apache.hadoop.hive.ql.exec.UDF;
- public final class SortFieldContent extends UDF {
- public String evaluate( final String str, String delimiter) {
- if (str == null ) {
- return null ;
- }
- if (delimiter == null) {
- delimiter = "," ;
- }
- String[] strs = str.split(delimiter);
- Arrays. sort(strs);
- String result = "" ;
- for (int i = 0; i < strs. length; i++) {
- if (result.length() > 0) {
- result.concat(delimiter);
- }
- result.concat(strs[i]);
- }
- return result;
- }
- public String evaluate( final String str, String delimiter, String order) {
- if (str == null ) {
- return null ;
- }
- if (delimiter == null) {
- delimiter = "," ;
- }
- if (order != null && order.toUpperCase().equals( "ASC" )) {
- return evaluate(str, delimiter);
- } else {
- String[] strs = str.split(delimiter);
- Arrays. sort(strs);
- String result = "" ;
- for (int i = strs. length - 1; i >= 0; i--) {
- if (result.length() > 0) {
- result.concat(delimiter);
- }
- result.concat(strs[i]);
- }
- return result;
- }
- }
- }
UDAF步骤:
UDAF(User- Defined Aggregation Funcation)用来解决 多行输入一行输出(Many-to-On maping) 的需求。1.函数类继承org.apache.hadoop.hive.ql.exec.UDAF内部类实现接口org.apache.hadoop.hive.ql.exec.UDAFEvaluator2.Evaluator需要实现 init、iterate、terminatePartial、merge、terminate这几个函数具体执行过程如图:
- package cn.sina.stat.hive.udaf;
- import java.util.Arrays;
- import org.apache.hadoop.hive.ql.exec.UDAF;
- import org.apache.hadoop.hive.ql.exec.UDAFEvaluator;
- public class ConcatClumnGroupByKeyWithOrder extends UDAF {
- public static class ConcatUDAFEvaluator implements UDAFEvaluator {
- public static class PartialResult {
- String result;
- String delimiter;
- String order;
- }
- private PartialResult partial;
- public void init() {
- partial = null;
- }
- public boolean iterate(String value, String delimiter, String order) {
- if (value == null) {
- return true;
- }
- if (partial == null) {
- partial = new PartialResult();
- partial.result = new String("");
- if (delimiter == null || delimiter.equals("")) {
- partial.delimiter = new String(",");
- } else {
- partial.delimiter = new String(delimiter);
- }
- if (order != null
- && (order.toUpperCase().equals("ASC") || order
- .toUpperCase().equals("DESC"))) {
- partial.order = new String(order);
- } else {
- partial.order = new String("ASC");
- }
- }
- if (partial.result.length() > 0) {
- partial.result = partial.result.concat(partial.delimiter);
- }
- partial.result = partial.result.concat(value);
- return true;
- }
- public PartialResult terminatePartial() {
- return partial;
- }
- public boolean merge(PartialResult other) {
- if (other == null) {
- return true;
- }
- if (partial == null) {
- partial = new PartialResult();
- partial.result = new String(other.result);
- partial.delimiter = new String(other.delimiter);
- partial.order = new String(other.order);
- } else {
- if (partial.result.length() > 0) {
- partial.result = partial.result.concat(partial.delimiter);
- }
- partial.result = partial.result.concat(other.result);
- }
- return true;
- }
- public String terminate() {
- String[] strs = partial.result.split(partial.delimiter);
- Arrays.sort(strs);
- String result = new String("");
- if (partial.order.equals("DESC")) {
- for (int i = strs.length - 1; i >= 0; i--) {
- if (result.length() > 0) {
- result.concat(partial.delimiter);
- }
- result.concat(strs[i]);
- }
- } else {
- for (int i = 0; i < strs.length; i++) {
- if (result.length() > 0) {
- result.concat(partial.delimiter);
- }
- result.concat(strs[i]);
- }
- }
- return new String(result);
- }
- }
- }
UDTF步骤:
UDTF(User-Defined Table-Generating Functions) 用来解决 输入一行输出多行(On-to-many maping) 的需求。1.继承org.apache.hadoop.hive.ql.udf.generic.GenericUDTF
2.实现initialize, process, close三个方法
a.initialize初始化验证,返回字段名和字段类型
b.初始化完成后,调用process方法,对传入的参数进行处理,通过forword()方法把结果返回
c.最后调用close()方法进行清理工作下面是我写的一个用来切分”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 { // TODO Auto-generated method stub } @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有两种使用方法,一种直接放到select后面,一种和lateral view一起使用。1:直接select中使用:select explode_map(properties) as (col1,col2) from src;不可以添加其他字段使用:select a, explode_map(properties) as (col1,col2) from src不可以嵌套调用:select explode_map(explode_map(properties)) from src不可以和group by/cluster by/distribute by/sort by一起使用:select explode_map(properties) as (col1,col2) from src group by col1, col22:和lateral view一起使用:select src.id, mytable.col1, mytable.col2 from src lateral view explode_map(properties) mytable as col1, col2;此方法更为方便日常使用。执行过程相当于单独执行了两次抽取,然后union到一个表里。
文献出处:http://blog.csdn.net/cheersu/article/details/8333045
文献出处:http://blog.csdn.net/longzilong216/article/details/23921235
相关推荐
ADD JAR /path/to/your/hiveUDF.jar; CREATE TEMPORARY FUNCTION mask AS 'com.yourpackage.MaskingUDF'; ``` 4. **使用UDF**: 注册完成后,你可以在查询中直接使用`mask`函数。假设我们有一个包含手机号码的表`...
这些函数可以是单行输入单行输出的UDF,多行输入单行输出的UDF(UDAF,User Defined Aggregation Function),或者多行输入多行输出的UDTF(User Defined Table Generating Function)。 2. **Java编程**: Hive ...
Hive 支持多种类型的 UDF,包括普通函数(UDF)、聚合函数(UDAF)和表生成函数(UDTF)。UDF 允许用户扩展 Hive 的功能,处理特定的数据转换和计算任务。例如,你可以创建一个 UDF 来处理文本,如分词、去除停用词...
本示例“hive自定义函数demo”将探讨如何在Hive中开发和使用自定义函数(UDF),这对于扩展Hive的功能和适应特定业务需求至关重要。下面,我们将深入学习与Hive自定义函数相关的知识。 1. **什么是Hive UDF?** ...
Hive支持三种类型的自定义函数:用户定义的函数(UDF)、用户定义的聚合函数(UDAF)和用户定义的表生成函数(UDTF)。本篇文章主要介绍UDF的实现方法。 ##### 2.1 UDF的作用 - **扩展性**:允许开发人员根据具体...
3. Hive自定义函数(UDF): - UDF定义:用户可以编写Java代码实现特定功能的函数,然后在Hive SQL中调用。 - UDAF(用户定义的聚合函数):用于处理一组输入值并返回单个值,如自定义平均值、众数等。 - UDTF...
Hive UDF分为三种主要类别:UDF(User Defined Scalar Functions),UDAF(User Defined Aggregate Functions),以及UDTF(User Defined Table Generating Functions)。UDF处理单行输入并返回单行输出,如字符串...
内置聚合函数(UDAF)和表生成函数(UDTF)是Hive UDF中的高级功能。UDAF允许用户编写自定义的聚合逻辑,如自定义的count、sum、avg等;UDTF则允许用户将一行数据转换为多行数据,或者将多行数据合并为一行数据输出...
hive-udfhive自定义函数主要实现hive3种自定义函数1,udf函数,主要用于处理一对一数据处理2,udtf函数,主要用于处理一对多数据处理2,udaf函数,主要用与处理多对一数据聚合处理
Hive 的灵活性之一在于支持用户自定义函数(UDF),包括用户定义的单行函数(UDF)、用户定义的多行函数(UDAF)和用户定义的表函数(UDTF)。这些自定义函数允许开发者扩展Hive的功能,以满足特定的业务需求。 ...
这是一些有用的 Hive UDF 和 UDAF 的集合。 提供的功能 UDAF Mode ( de.frosner.hive.udaf.Mode ) - 计算组列的统计模式 从源头构建 git clone https://github.com/FRosner/mustached-hive-udfs.git cd mustached...
- Hive UDFs 分为三类:UDF(单行函数),UDAF(聚合函数)和 UDTF(多行函数)。`hive-udf-collections` 主要关注 UDF。 - UDF 允许用户扩展 Hive 的功能,解决内置函数无法满足的特定需求。 - UDFs 必须用 Java...
Hive的UDF可以分为三类:UDF(单行)、UDAF(多行,聚合)和UDTF(多行到多行)。在这个例子中,我们讨论的是UDF,因为它处理单行数据。 在压缩包文件名`addmonth`中,我们可以猜测这个文件可能包含了实现月份加法...
Hive的自定义函数机制为用户提供了极大的灵活性,无论是简单的数据转换(UDF)还是复杂的聚合计算(UDAF),都能通过编写Java代码来实现。这种自定义能力使得Hive能够适应各种业务场景,有效地处理大数据分析中的...
例如:`ADD JAR /path/to/your/hiveudf.jar;` 2. 创建函数:使用CREATE FUNCTION语句注册你的UDF,指定函数名称、类路径和任何其他必要信息。例如:`CREATE FUNCTION my_udf AS '...
1. **编写Java类**:实现Hive提供的特定接口,如UDF、UDAF或UDTF。 2. **添加元数据**:在Hive Metastore中注册UDF,指定函数名、输入/输出类型等信息。 3. **编译与部署**:将Java类打包成JAR文件,上传到Hadoop...
hive-udf-hook UDF开发及发布过程 1 用户编写UDF实现类 2 编写完成后,在UDFHooks类中调用相关注册函数: 调用 FunctionRegistry.registerUDF 注册udf 调用 FunctionRegistry.registerUDAF 注册udaf 调用...
Hive 基本概念 Hive 应用场景。 Hive 与hadoop的关系。 Hive 与传统数据库对比。 Hive 的数据存储机制。 Hive 基本操作 ...Hive 中的DDL操作。...Hive UDF/UDAF开发实例。 Hive 执行过程分析及优化策略
个人 Hive UDAF 有一堆 Hive UDAF(用户定义的聚合函数)不在标准 Hive 分布中,因为它们可能会导致大型数据集的 OOM。 要使用它们,您需要加载 jar 文件,然后为每个要使用的函数创建一个临时函数: ADD JAR target...
8. **Hive 的扩展性**:Hive 可以通过添加新的 SerDe(序列化/反序列化库)支持不同格式的数据,通过 Hive UDF、UDAF 和 UDTF 实现自定义功能,以适应特定的业务需求。 9. **Hive 的安全性**:Hive 支持角色基础的...