`

Hive 自定义UDF UDAF UDTF

阅读更多
UDF步骤:
UDF(User-Defined-Function) 用来解决 一行输入一行输出(On-to-On maping) 的需求。
1.继承org.apache.hadoop.hive.ql.exec.UDF
2.实现evaluate函数,evaluate函数支持重载
[java] view plaincopy
 
  1. package cn.sina.stat.hive.udf;  
  2. import java.util.Arrays;  
  3. import org.apache.hadoop.hive.ql.exec.UDF;  
  4. public final class SortFieldContent extends UDF {  
  5.         public String evaluate( final String str, String delimiter) {  
  6.                if (str == null ) {  
  7.                       return null ;  
  8.               }  
  9.                if (delimiter == null) {  
  10.                      delimiter = "," ;  
  11.               }  
  12.               String[] strs = str.split(delimiter);  
  13.               Arrays. sort(strs);  
  14.               String result = "" ;  
  15.                for (int i = 0; i < strs. length; i++) {  
  16.                       if (result.length() > 0) {  
  17.                            result.concat(delimiter);  
  18.                      }  
  19.                      result.concat(strs[i]);  
  20.               }  
  21.                return result;  
  22.        }  
  23.   
  24.         public String evaluate( final String str, String delimiter, String order) {  
  25.                if (str == null ) {  
  26.                       return null ;  
  27.               }  
  28.                if (delimiter == null) {  
  29.                      delimiter = "," ;  
  30.               }  
  31.                if (order != null && order.toUpperCase().equals( "ASC" )) {  
  32.                       return evaluate(str, delimiter);  
  33.               } else {  
  34.                      String[] strs = str.split(delimiter);  
  35.                      Arrays. sort(strs);  
  36.                      String result = "" ;  
  37.                       for (int i = strs. length - 1; i >= 0; i--) {  
  38.                             if (result.length() > 0) {  
  39.                                   result.concat(delimiter);  
  40.                            }  
  41.                            result.concat(strs[i]);  
  42.                      }  
  43.                       return result;  
  44.               }  
  45.        }  
  46. }  

UDAF步骤:
UDAF(User- Defined Aggregation Funcation)用来解决 多行输入一行输出(Many-to-On maping) 的需求。
1.函数类继承org.apache.hadoop.hive.ql.exec.UDAF
   内部类实现接口org.apache.hadoop.hive.ql.exec.UDAFEvaluator
2.Evaluator需要实现 init、iterate、terminatePartial、merge、terminate这几个函数
   具体执行过程如图:
[java] view plaincopy
 
  1. package cn.sina.stat.hive.udaf;  
  2. import java.util.Arrays;  
  3. import org.apache.hadoop.hive.ql.exec.UDAF;  
  4. import org.apache.hadoop.hive.ql.exec.UDAFEvaluator;  
  5.   
  6. public class ConcatClumnGroupByKeyWithOrder extends UDAF {  
  7.      public static class ConcatUDAFEvaluator implements UDAFEvaluator {  
  8.           public static class PartialResult {  
  9.                String result;  
  10.                String delimiter;  
  11.                String order;  
  12.           }  
  13.   
  14.           private PartialResult partial;  
  15.   
  16.           public void init() {  
  17.                partial = null;  
  18.           }  
  19.   
  20.           public boolean iterate(String value, String delimiter, String order) {  
  21.   
  22.                if (value == null) {  
  23.                     return true;  
  24.                }  
  25.                if (partial == null) {  
  26.                     partial = new PartialResult();  
  27.                     partial.result = new String("");  
  28.                     if (delimiter == null || delimiter.equals("")) {  
  29.                          partial.delimiter = new String(",");  
  30.                     } else {  
  31.                          partial.delimiter = new String(delimiter);  
  32.                     }  
  33.                     if (order != null  
  34.                               && (order.toUpperCase().equals("ASC") || order  
  35.                                         .toUpperCase().equals("DESC"))) {  
  36.                          partial.order = new String(order);  
  37.                     } else {  
  38.                          partial.order = new String("ASC");  
  39.                     }  
  40.   
  41.                }  
  42.                if (partial.result.length() > 0) {  
  43.                     partial.result = partial.result.concat(partial.delimiter);  
  44.                }  
  45.   
  46.                partial.result = partial.result.concat(value);  
  47.   
  48.                return true;  
  49.           }  
  50.   
  51.           public PartialResult terminatePartial() {  
  52.                return partial;  
  53.           }  
  54.   
  55.           public boolean merge(PartialResult other) {  
  56.                if (other == null) {  
  57.                     return true;  
  58.                }  
  59.                if (partial == null) {  
  60.                     partial = new PartialResult();  
  61.                     partial.result = new String(other.result);  
  62.                     partial.delimiter = new String(other.delimiter);  
  63.                     partial.order = new String(other.order);  
  64.                } else {  
  65.                     if (partial.result.length() > 0) {  
  66.                          partial.result = partial.result.concat(partial.delimiter);  
  67.                     }  
  68.                     partial.result = partial.result.concat(other.result);  
  69.                }  
  70.                return true;  
  71.           }  
  72.   
  73.           public String terminate() {  
  74.                String[] strs = partial.result.split(partial.delimiter);  
  75.                Arrays.sort(strs);  
  76.                String result = new String("");  
  77.                if (partial.order.equals("DESC")) {  
  78.                     for (int i = strs.length - 1; i >= 0; i--) {  
  79.                          if (result.length() > 0) {  
  80.                               result.concat(partial.delimiter);  
  81.                          }  
  82.                          result.concat(strs[i]);  
  83.                     }  
  84.                } else {  
  85.                     for (int i = 0; i < strs.length; i++) {  
  86.                          if (result.length() > 0) {  
  87.                               result.concat(partial.delimiter);  
  88.                          }  
  89.                          result.concat(strs[i]);  
  90.                     }  
  91.                }  
  92.                return new String(result);  
  93.           }  
  94.      }  
  95. }  

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, col2
 
2:和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

 

分享到:
评论

相关推荐

    Hive的Udf函数进行数据脱敏

    ADD JAR /path/to/your/hiveUDF.jar; CREATE TEMPORARY FUNCTION mask AS 'com.yourpackage.MaskingUDF'; ``` 4. **使用UDF**: 注册完成后,你可以在查询中直接使用`mask`函数。假设我们有一个包含手机号码的表`...

    hive UDF需要jar包

    这些函数可以是单行输入单行输出的UDF,多行输入单行输出的UDF(UDAF,User Defined Aggregation Function),或者多行输入多行输出的UDTF(User Defined Table Generating Function)。 2. **Java编程**: Hive ...

    Hive_UDF.rar_hive_sqoop

    Hive 支持多种类型的 UDF,包括普通函数(UDF)、聚合函数(UDAF)和表生成函数(UDTF)。UDF 允许用户扩展 Hive 的功能,处理特定的数据转换和计算任务。例如,你可以创建一个 UDF 来处理文本,如分词、去除停用词...

    hive自定义函数demo

    本示例“hive自定义函数demo”将探讨如何在Hive中开发和使用自定义函数(UDF),这对于扩展Hive的功能和适应特定业务需求至关重要。下面,我们将深入学习与Hive自定义函数相关的知识。 1. **什么是Hive UDF?** ...

    hive的自定义函数

    Hive支持三种类型的自定义函数:用户定义的函数(UDF)、用户定义的聚合函数(UDAF)和用户定义的表生成函数(UDTF)。本篇文章主要介绍UDF的实现方法。 ##### 2.1 UDF的作用 - **扩展性**:允许开发人员根据具体...

    hive数仓、hive SQL 、 hive自定义函数 、hive参数深入浅出

    3. Hive自定义函数(UDF): - UDF定义:用户可以编写Java代码实现特定功能的函数,然后在Hive SQL中调用。 - UDAF(用户定义的聚合函数):用于处理一组输入值并返回单个值,如自定义平均值、众数等。 - UDTF...

    dataiku hive udf

    Hive UDF分为三种主要类别:UDF(User Defined Scalar Functions),UDAF(User Defined Aggregate Functions),以及UDTF(User Defined Table Generating Functions)。UDF处理单行输入并返回单行输出,如字符串...

    HIve UDF 说明书

    内置聚合函数(UDAF)和表生成函数(UDTF)是Hive UDF中的高级功能。UDAF允许用户编写自定义的聚合逻辑,如自定义的count、sum、avg等;UDTF则允许用户将一行数据转换为多行数据,或者将多行数据合并为一行数据输出...

    hive-udf:hive自定义函数

    hive-udfhive自定义函数主要实现hive3种自定义函数1,udf函数,主要用于处理一对一数据处理2,udtf函数,主要用于处理一对多数据处理2,udaf函数,主要用与处理多对一数据聚合处理

    自定义hive函数

    Hive 的灵活性之一在于支持用户自定义函数(UDF),包括用户定义的单行函数(UDF)、用户定义的多行函数(UDAF)和用户定义的表函数(UDTF)。这些自定义函数允许开发者扩展Hive的功能,以满足特定的业务需求。 ...

    mustached-hive-udfs:一些有用的 Hive UDF 和 UDAF

    这是一些有用的 Hive UDF 和 UDAF 的集合。 提供的功能 UDAF Mode ( de.frosner.hive.udaf.Mode ) - 计算组列的统计模式 从源头构建 git clone https://github.com/FRosner/mustached-hive-udfs.git cd mustached...

    hive-udf-collections:Hive 用户定义函数 (UDF) 集合

    - Hive UDFs 分为三类:UDF(单行函数),UDAF(聚合函数)和 UDTF(多行函数)。`hive-udf-collections` 主要关注 UDF。 - UDF 允许用户扩展 Hive 的功能,解决内置函数无法满足的特定需求。 - UDFs 必须用 Java...

    hive按月份加减udf范例

    Hive的UDF可以分为三类:UDF(单行)、UDAF(多行,聚合)和UDTF(多行到多行)。在这个例子中,我们讨论的是UDF,因为它处理单行数据。 在压缩包文件名`addmonth`中,我们可以猜测这个文件可能包含了实现月份加法...

    Hive自定义函数

    Hive的自定义函数机制为用户提供了极大的灵活性,无论是简单的数据转换(UDF)还是复杂的聚合计算(UDAF),都能通过编写Java代码来实现。这种自定义能力使得Hive能够适应各种业务场景,有效地处理大数据分析中的...

    hive 创建自定义函数 和 hive加载说明

    例如:`ADD JAR /path/to/your/hiveudf.jar;` 2. 创建函数:使用CREATE FUNCTION语句注册你的UDF,指定函数名称、类路径和任何其他必要信息。例如:`CREATE FUNCTION my_udf AS '...

    hive-exec-udf

    1. **编写Java类**:实现Hive提供的特定接口,如UDF、UDAF或UDTF。 2. **添加元数据**:在Hive Metastore中注册UDF,指定函数名、输入/输出类型等信息。 3. **编译与部署**:将Java类打包成JAR文件,上传到Hadoop...

    hive-udf-tools:hive udf 部署工具,开发工具...

    hive-udf-hook UDF开发及发布过程 1 用户编写UDF实现类 2 编写完成后,在UDFHooks类中调用相关注册函数: 调用 FunctionRegistry.registerUDF 注册udf 调用 FunctionRegistry.registerUDAF 注册udaf 调用...

    《Hive的开发指南》

    Hive 基本概念 Hive 应用场景。 Hive 与hadoop的关系。 Hive 与传统数据库对比。 Hive 的数据存储机制。 Hive 基本操作 ...Hive 中的DDL操作。...Hive UDF/UDAF开发实例。 Hive 执行过程分析及优化策略

    hive:个人配置单元 UDAF

    个人 Hive UDAF 有一堆 Hive UDAF(用户定义的聚合函数)不在标准 Hive 分布中,因为它们可能会导致大型数据集的 OOM。 要使用它们,您需要加载 jar 文件,然后为每个要使用的函数创建一个临时函数: ADD JAR target...

    设计开发 Hive 编程指南 完整版

    8. **Hive 的扩展性**:Hive 可以通过添加新的 SerDe(序列化/反序列化库)支持不同格式的数据,通过 Hive UDF、UDAF 和 UDTF 实现自定义功能,以适应特定的业务需求。 9. **Hive 的安全性**:Hive 支持角色基础的...

Global site tag (gtag.js) - Google Analytics