`
ruishen
  • 浏览: 52867 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

hive 自定义函数UDF,UDAF

 
阅读更多
自定义函数

在hive中,有时候一些内置的函数,和普通的查询操作已经满足不了我们要查询的要求,这时候可以自己写一些自定义函数来处理。自定义函数(user defined function =UDF)

由于hive本身是用java语言开发,所以udf必须用java来写才可以。

Hive中有三种UDF

1.普通udf(UDF)
操作单个数据行,且产生一个数据作为输出。例如(数学函数,字符串函数)

2.聚合udf (UDAF)
接受多个数据行,并产生一个数据行作为输出。例如(COUNT,MAX函数等)

3.表生成UDF(UDTF)
接受一个数据行,然后返回产生多个数据行(一个表作为输出)。比如lateral view(据说是一个将行转成列的函数)。

编写UDF

编写UDF必须满足一下:

1.必须是org.apache.hadoop.hive.ql.exec.UDF的子类

2.必须实现evaluate函数。


1.strip UDF

java code

package com.hcr.hadoop.hive;
 
import org.apache.commons.lang.StringUtils;
import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.io.Text;
 
public class Strip extends UDF {
   public Text evaluate(String str) {
      return str == null ? null : new Text(StringUtils.strip(str));
   }
   public Text evaluate(String str,String chrStr) {
      return str == null ? null : new Text(StringUtils.strip(str,chrStr));
   }
}


写完代码打成jar包hcr.jar

hive> add jar/root/hcr/tmp/hcr.jar; 
Added /root/hcr/tmp/hcr.jar to class path
Added resource: /root/hcr/tmp/hcr.jar


声明strip函数

create temporary function  strip as 'com.hcr.hadoop.hive.Strip';
select year,strip(name,'ruishen') from records2;

原数据

1990    ruishenh0
1992    ruishenh2
1991    ruishenh1
1993    ruishenh3
1994    ruishenh4
1995    ruishenh5
1996    ruishenh6
1997    ruishenh7
1998    ruishenh8

执行完后显示


1990    0
1992    2
1991    1
1993    3
1994    4
1995    5
1996    6
1997    7
1998    8

编写UDAF

编写UDAF必须满足一下:

1.必须是org.apache.hadoop.hive.ql.exec.UDAF的子类

2.且包含一个或多个嵌套的,实现了org.apache.hadoop.hive.ql.exec.UDAFEvaluator的静态类

3.如果是计算函数必须包含如下5个函数

a)Init()
初始化计算函数和内部数据结构状态等。

b)Iterate()
每一个新值调用聚集计算时都会调用这个函数。计算函数要聚集计算的结果更新其内部状态,iterate函数接受的参数和hive中被调用函数的参数是对应的。

c)terminatePartial()
这个就是取计算到当前(局部)的时候的数据对象函数。(比如1-10。计算5的时候要调用一下这个函数查看一下当前的内部结构对象也就是1-5的聚合结果)

d)merge()
在hive决定要合并一个部分聚集值和另一个部分聚集值是会调用merge()方法,该方法接受一个对象输入,这个对象的类型必须和terminatePartial()返回的一致。

e)terminate()
hive需要最终聚集结果时会调用terminate方法,计算函数需要把状态作为一个值返回。

实例UDAF(一)

package com.hcr.hadoop.hive;
 
import org.apache.hadoop.hive.ql.exec.UDAF;
import org.apache.hadoop.hive.ql.exec.UDAFEvaluator;
import org.apache.hadoop.io.IntWritable;
 
public class Maxinum extends UDAF {
 
   public static class MaxinumIntUDAFEvaluator implements UDAFEvaluator {
 
      private IntWritable result;
 
      @Override
      public void init() {
        result = null;
      }
 
      public boolean iterate(IntWritable value) {
        if (value == null) {
           return true;
        }
        if (result == null) {
           result = new IntWritable(value.get());
        } else {
           System.out.println("result:"+result+",value:"+value);
           result.set(Math.max(result.get(), value.get()));
        }
        return true;
      }
 
      public IntWritable terminatePartial() {
        return result;
      }
 
      public boolean merge(IntWritable value) {
        System.out.println("merge-result:"+result);
        return iterate(value);
      }
 
      public IntWritable terminate() {
        System.out.println("terminate-result:"+result);
        return result;
      }
   }
 
}

hive> add jar /root/hcr/tmp/hcr.jar;
Added /root/hcr/tmp/hcr.jar to class path
Added resource: /root/hcr/tmp/hcr.jar
hive>  create temporary function  maxinum as 'com.hcr.hadoop.hive.Maxinum';
OK
Time taken: 0.192 seconds
hive> select maxinum(temperature) fromrecords;
58
 

实例UDAF(二)

package com.hcr.hadoop.hive;
 
import org.apache.hadoop.hive.ql.exec.UDAF;
import org.apache.hadoop.hive.ql.exec.UDAFEvaluator;
import org.apache.hadoop.hive.serde2.io.DoubleWritable;
 
public class Mean extends UDAF {
 
   public static class MeanDoubleUDAFEvaluator implements UDAFEvaluator {
 
      public static class PartialResult {
        double sum;
        long count;
      }
 
      private PartialResult partial;
 
      @Override
      public void init() {
        partial = null;
      }
 
      public boolean iterate(DoubleWritable value) {
        if (value == null) {
           return true;
        }
        if (partial == null) {
           partial = new PartialResult();
        }
        partial.sum += value.get();
        partial.count++;
        return true;
      }
 
      public PartialResult terminatePartial() {
        return partial;
      }
 
      public boolean merge(PartialResult value) {
        if (value == null) {
           return true;
        }
        if (partial == null) {
           partial = new PartialResult();
        }
        partial.sum += value.sum;
        partial.count += value.count;
        return true;
      }
 
      public DoubleWritable terminate() {
        if (partial == null)
           return null;
        return new DoubleWritable(partial.sum / partial.count);
      }
   }
 
}


hive> add jar /root/hcr/tmp/hcr.jar;                               
Added /root/hcr/tmp/hcr.jar to class path
Added resource: /root/hcr/tmp/hcr.jar
hive> create temporary function  mean as'com.hcr.hadoop.hive.Mean';
OK
Time taken: 0.198 seconds
hive>ALTER TABLE records CHANGE COLUMN temperature temperature double;
hive> select mean(temperature) from records;
OK
43.916666666666664
Time taken: 20.769 seconds
hive>

关于很多系统内置的UDAF函数可以在下边这个类中查看注册的UDF和UDAF等

org.apache.hadoop.hive.ql.exec.FunctionRegistry

参照hive内部的写法

先写一个resolver类,然后便写evaluator(GenericUDAFEvaluator的子类)类

参靠:

http://www.cnblogs.com/ggjucheng/archive/2013/02/01/2888051.html

https://cwiki.apache.org/confluence/display/Hive/GenericUDAFCaseStudy#GenericUDAFCaseStudy-Preliminaries

分享到:
评论

相关推荐

    hive的自定义函数

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

    hive自定义函数demo

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

    Hive的Udf函数进行数据脱敏

    在Hive中,UDF分为三种类型:UDF(单行函数)、UDAF(累积聚合函数)和UDTF(多行转换函数)。在这里,我们只需要UDF,因为它适用于处理单行数据。 1. **编写Java类**: 要创建一个UDF,你需要编写一个Java类,该...

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

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

    hive UDF需要jar包

    在Hive中,UDF(User Defined Functions)是用户自定义函数,允许开发人员扩展Hive的内置功能,以满足特定的数据处理需求。Hive UDF的实现通常涉及到编写Java代码,并将其打包成JAR(Java Archive)文件,然后在Hive...

    hive-udf:hive自定义函数

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

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

    然而,有时Hive的内置函数并不能满足所有的业务需求,这时我们就需要创建自定义函数(UDF,User Defined Function)。这篇博文主要探讨了如何在Hive中创建自定义函数以及如何加载它们,这对于深化Hive的使用和解决...

    自定义hive函数

    综上所述,自定义Hive函数(UDF、UDAF)极大地增强了Hive的功能,使其能处理各种复杂的业务逻辑,适应不同的数据处理需求。开发和使用这些自定义函数时,需要理解Hive的生命周期、执行模型以及如何将Java代码集成到...

    Hive自定义函数

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

    hive常用函数

    Hive作为一款数据仓库工具,主要用于处理...熟练使用Hive函数,不仅可以提高数据处理的效率,还可以提升数据查询和分析的灵活性。对于数据科学家和工程师而言,深入理解Hive的各种函数对于日常工作的开展至关重要。

    Hive_UDF.rar_hive_sqoop

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

    HIve UDF 说明书

    Hive UDF(User-Defined Functions,用户定义函数)是Hive中强大的功能,允许用户在Hive查询中使用自定义的函数来进行更复杂的操作。Hive是一个建立在Hadoop基础上的高级数据仓库工具,它允许用户使用类似SQL的语言...

    dataiku hive udf

    Hive UDF(User Defined Functions)则是Hive中扩展其功能的关键部分,允许用户自定义函数来处理特定的数据分析任务。"dataiku hive udf"项目提供的是一套通用的Hive UDF源码,对于那些想深入开发Hadoop Hive应用的...

    hive-exec-udf

    《深入理解Hive执行与用户自定义函数(hive-exec-udf)》 在大数据处理领域,Apache Hive作为一款基于Hadoop的数据仓库工具,扮演着重要角色。它提供了类SQL的查询语言(HQL)来操作分布式存储的数据,极大地简化了大...

    hive按月份加减udf范例

    在Hive中,UDF(User Defined Function)是用户自定义函数,允许我们扩展Hive的功能以满足特定的业务需求。本示例主要讲解如何在Hive中实现按月份的加减操作,这在时间序列分析或周期性报告中非常常见。 标题"hive...

    hive:个人配置单元 UDAF

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

    hive 函数大全

    以下是对“Hive函数大全”这个主题的详细讲解。 1. **数据类型**:Hive支持多种数据类型,包括基本类型如整型(TINYINT, SMALLINT, INT, BIGINT)、浮点型(FLOAT, DOUBLE)、布尔型(BOOLEAN)、字符串(STRING)...

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

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

    hive函数.docx

    ### Hive函数概述 本文档旨在详细介绍Hive中的各种内置函数及其使用方法,这些内容主要源自Apache官方文档并已翻译成中文。Hive是一种基于Hadoop的数据仓库工具,它提供了类SQL的查询语言“HiveQL”,使用户可以...

    《Hive的开发指南》

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

Global site tag (gtag.js) - Google Analytics