`

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

 

分享到:
评论

相关推荐

    spark-hive-udf:Spark Hive UDF示例

    Spark Hive UDF示例 建立项目 mvn clean package 将spark-hive-udf-1.0.0-SNAPSHOT.jar复制到边缘节点临时目录 spark-hive-udf]# cp target/spark-hive-udf-1.0.0-SNAPSHOT.jar /tmp 通过提供罐子来启动火花壳 spark...

    自定义hive函数

    自定义 hive udf udaf 有url解析,获取网站主域名,根据ip获取区域码,有rownum,列聚合以及一些业务实现udf。

    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...

    javasql笔试题-spark-hive-udf:展示如何在ApacheSpark中使用HiveUDF的示例项目

    Hive UDF 项目 介绍 该项目只是一个示例,包含多个 (UDF),用于 Apache Spark。 它旨在演示如何在 Scala 或 Java 中构建 Hive UDF 并在 . 为什么要使用 Hive UDF? Hive UDF 的一个特别好的用途是与 Python 和 ...

    hive-udf:hive自定义函数

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

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

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

    hive:个人配置单元 UDAF

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

    datasketches-hive:Hive的草图适配器

    =================适用于Apache Hive的DataSketches Java UDF / UDAF适配器请访问主要的以获取更多信息。 如果您有兴趣对此站点做出贡献,请参阅我们的页面以了解如何与我们联系。Hadoop Hive UDF / UDAF 请参阅Java...

    hive常用函数

    hive常用函数,包括时间、类型、udf、udaf等等的归纳。

    赵伟:HIVE在腾讯分布式数据仓库实践

    赵伟首先介绍了他们的TDW核心架构,HIVE,MapReduce,HDFS及PostgreSQL构成。赵伟分享了最核心的HIVE模块在TDW中的实践经验;HIVE是一个在Hadoop上构建数据仓库的软件,它...实现了基本的SQL功能,可扩充UDF/UDAF...

    hive

    Apache Hive(TM)数据仓库软件有助于查询和... HiveQL还可以使用自定义标量函数(UDF),聚合(UDAF)和表函数(UDTF)进行扩展。https://mirrors.tuna.tsinghua.edu.cn/apache/hive/hive-standalone-metastore-3.0.0/

    Spark:Apache Spark是一个快速的内存数据处理引擎,具有优雅且富有表现力的开发API,可让数据工作者高效执行需要快速迭代访问数据集的流,机器学习或SQL工作负载。该项目将在Scala中提供Spark的示例程序语

    使用Spark-2.1实现自定义UDF,UDAF,Partitioner 使用数据框(ComplexSchema,DropDuplicates,DatasetConversion,GroupingAndAggregation) 使用数据集处理Parquet文件按特定列对数据进行分区并按分区进行存储使用...

    Hadoop权威指南(中文版)2015上传.rar

    1.8.2 编写UDAF 第13章 HBase 2.1 HBasics 2.1.1 背景 2.2 概念 2.2.1 数据模型的"旋风之旅" 2.2.2 实现 2.3 安装 2.3.1 测试驱动 2.4 客户机 2.4.1 Java 2.4.2 Avro,REST,以及Thrift 2.5 示例 2.5.1 模式 2.5.2 ...

    Hadoop权威指南 第二版(中文版)

     用户自定义函数  过滤UDF  计算UDF  加载UDF  数据处理操作  加载和存储数据  过滤数据  分组与连接数据  对数据进行排序  组合和分割数据  Pig实战  并行处理  参数代换 第12章 Hive  1.1 安装Hive ...

    蜂巢:Apache蜂巢

    HiveSQL也可以通过用户定义的函数(UDF),用户定义的集合(UDAF)和用户定义的表函数(UDTF)扩展为用户代码。 Hive用户在执行SQL查询时可以选择3种运行时。 用户可以选择Apache Hadoop MapReduce,Apache Tez或...

    大数据场景化解决方案.pdf

    UDTF(User-Defined Table-Generating Functions) ⽤于接收单个数据⾏,并产⽣多个数据⾏作为输出。 Hive调优 数据倾斜 数据倾斜指计算数据的时候,数据的分散度不够,导致⼤量的数据集中到了⼀台或者⼏台机器上...

Global site tag (gtag.js) - Google Analytics