`
kavy
  • 浏览: 891162 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Hive自定义函数之UDF

 
阅读更多

 为了满足用户的个性化需求,Hive被设计成了一个很开放的系统,很多内容都可以定制,主要包括: 
                1)、文件格式; 
                2)、内存中的数据格式,如Hadoop的Writable/Text; 
                3)、用户提供的MapReduce脚本,不管使用何种语言都可以通过标准的stdin/stdout传输数据; 
                4)、用户自定义函数。 
        本节我们主要学习用户自定义函数。虽然Hive已经提供了很多内存的函数,但是还是不能,满足用户的需求,因此有提供了自定义函数供用户自己开发函数来满足自己的需求。之定义函数主要分三类: 
                1)、UDF(User-Defined-Function)用户自定义函数,输入一个数据然后产生一个数据; 
                2)、UDAF(User-Defined Aggregation Function)用户自定义聚合函数,多个输入数据然后产生一个输出参数; 
                3)、UDTF(User-Defined Table-generating Function)用户自定义表生成函,数,输入一行数据生成N行数据。 
   
        UDF 
        现在我们开始学习如何来开发自己的UDF函数。假设我们现在有一个被保存在littlebigdata.txt文件中的数据集:

Java代码  收藏代码
  1. edward capriolo,edward@media6degrees.com,2-12-1981,209.191.139.200,M,10  
  2. bob,bob@test.net,10-10-2004,10.10.10.1,M,50  
  3. sara connor,sara@sky.net,4-5-1974,64.64.5.1,F,2  
  4. ...  


        接下来我们顶一个Hive加载这个数据集:

Java代码  收藏代码
  1. hive> CREATE TABLE IF NOT EXISTS littlebigdata(  
  2.     >   name        STRING COMMENT '姓名',  
  3.     >   email       STRING COMMENT '邮箱',  
  4.     >   birthday    STRING COMMENT '生日',  
  5.     >   ip          STRING COMMENT 'ip',  
  6.     >   gender      STRING COMMENT '性别',  
  7.     >   anum        INT)  
  8.     > ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';  
  9.   
  10. hive> LOAD DATA LOCAL INPATH '${env:HOME}/littlebigdata.txt'  
  11.     > INTO TABLE littlebigdata;  


        我们接下来会写一个自定义的UDF根据数据集中的生日计算对应星座,首先新类要继承org.apache.hadoop.hive.ql.exec.UDF类,然而UDF类并不是一个抽象类,其中并没有用户自定义函数必须的evaluate()方法,子类必须实现一个或多个evaluate方法给Hive框架调用,这个evaluate方法正是所有实现类的逻辑部分所在,只有用户自己来写方法了:

Java代码  收藏代码
  1. package org.apache.hadoop.hive.contrib.udf.example;  
  2.   
  3. import java.text.SimpleDateFormat;  
  4. import java.util.Date;  
  5. import org.apache.hadoop.hive.ql.exec.UDF;  
  6. import org.apache.hadoop.hive.ql.exec.Description;  
  7.   
  8. @Description(name = "Zodiac",  
  9.    value = "FUNC_(date) - from the input data string " +  
  10.            "or separate month and day arguments,return the sign of the Zodiac.",  
  11.    extended = "Example:\n >SELECT _FUNC_(date_string) FROM src;\n" +   
  12.               " > SELECT _FUNC_(month,day) FROM src;")  
  13. public class ZodiacSignUDF extends UDF{  
  14.      private SimpleDateFormat df = null;  
  15.   
  16.      /** 
  17.       * 在默认构造函数中初始化df 
  18.       */  
  19.      public ZodiacSignUDF(){  
  20.          df = new SimpleDateFormat("MM-dd-yyyy");  
  21.      }  
  22.    
  23.      /** 
  24.       * 由出生日期获取星座 
  25.       * @param birthday -Date 
  26.       * @return 
  27.       */  
  28.      public String evaluate(Date birthday){  
  29.          return this.evaluate(birthday.getMonth() + 1,birthday.getDay());  
  30.      }  
  31.   
  32.      /** 
  33.       * 由出生日期获取星座 
  34.       * @param birthday -String 
  35.       * @return 
  36.       */  
  37.      public String evaluate(Date birthday){  
  38.          Date date = null;  
  39.          try{  
  40.             date = df.parse(birthday);  
  41.          }catch(Excetion e){  
  42.              //如果日期转换失败,就表明星座是未知的  
  43.              return null;  
  44.          }  
  45.          return this.evaluate(date.getMonth() + 1,date.getDay());  
  46.      }  
  47.        
  48.      /** 
  49.       * 由月份和出生日获取星座 
  50.       * @param month -int 
  51.       * @param day -int 
  52.       * @return 
  53.       */  
  54.      public String evaluate(Integer month,Integer day){  
  55.          if(month == 1){  
  56.             if(day < 20){  
  57.                return "Capricorn";  
  58.             }else{  
  59.                return "Aquarius";  
  60.             }  
  61.          }else if(month == 2){  
  62.             if(day < 19){  
  63.                return "Aquarius";  
  64.             }else{  
  65.                return "Pisces";  
  66.             }  
  67.          }  
  68.          /** ... other months here */  
  69.          return null;  
  70.      }  
  71. }  


        在HiveQL的执行中,没处理一行都会调用一次ZodiacSignUDF类的实例,然后将每一行的出生一起传给evaluate()方法并得到对应的星座返回给Hive。 

        那么接下来的问题是如何使用这个自定义函数呢? 
        首先需要用户便以这个类并将之打成一个jar包,然后将jar文件添加到Hive的classpath并使用CREATE FUNCTION语句将之定义为一个Hive能使用的方法:

Java代码  收藏代码
  1. hive> ADD JAR /full/path/to/zodiac.jar;  
  2. hive> CREATE TEMPORARY FUNCTION zodiac   
  3.       AS 'org.apache.hadoop.hive.contrib.udf.exampl.ZodiacSignUDF';             


        当然,上面的函数添加方法只能在Hive session会话期间使用,session结束后如还想使用该函数,那就必须再将上面的两部操作做一遍。如果这个函数是经常使用的,那么这么做就太繁琐了,这种情况下可以把上面的两操作语句添加到$HOME/.hiverc文件中作为全局函数,就想使用hive的内置行是一样:

Java代码  收藏代码
  1. hive> SELECT name,birthday,zodiac(birthday) FROM littlebigdata;  
  2. edward capriolo 2-12-1981   Aquarius  
  3. bob             10-10-2004  Libra  
  4. sara            4-5-1974    Aries  



        接着我们来看怎么删除一个·自定义函数:

Java代码  收藏代码
 
 
hive> DROP TEMPORARY FUNCTION IF EXISTS zodiac;  
 

HIVE如何使用自定义函数

HIVE提供了很多函数,但这些函数只能满足一般的需求,针对复杂的业务分析,需要自己开发适合业务需求的函数。如何开发HIVE的UDF/UDAF/UDTF,请参看如下博客介绍的自定义函数的模板: http://hugh-wangp.iteye.com/blog/1472371

 
如何在HIVE中使用自己定义的函数,可以有几种方式:
1.在HIVE会话中add 自定义函数的jar文件,然后创建function,继而使用函数
2.在进入HIVE会话之前先自动执行创建function,不用用户手工创建
3.把自定义的函数写到系统函数中,使之成为HIVE的一个默认函数,这样就不需要create temporary function

1.在HIVE会话中add 自定义函数的jar文件,然后创建function,继而使用函数
hive> ADD JAR /home/hugh.wangp/UDFMd5.jar;
Added /home/hugh.wangp/UDFMd5.jar to class path
hive> CREATE TEMPORARY FUNCTION udfmd5 AS 'udf.UDFMd5';
OK
Time taken: 0.014 seconds
hive> select udfmd5('a') from dual;
OK
0cc175b9c0f1b6a831c399e269772661

这种方式的弊端是:每次打开新的会话,就要重新执行一遍如上的add jar和create temporary function的命令。对普通的业务分析人员未免要求太高。第二种方法可以把业务人员释放出来


2.在进入HIVE会话之前先自动执行创建function
HIVE命令有个参数-i:在进入会话,待用户输入自己的HQL之前,先执行-i的参数。我们只需要把add jar和create temporary function的命令写到一个文件中,并把这个文件传到-i的参数,如此一来省去了每次要手工创建的工作。
但是这种方式也有个弊端,当我增添HIVE的gateway,就要拷贝一份这个文件,有时候遗漏真是不可避免的。第三种方法应该就是一个终极方案,只要HIVE本身代码不做修改,或者不删除特定的功能,这个函数就能一直用,而且可以把他作为HIVE的默认函数那样使用

3.把自定义的函数写到系统函数中,使之成为HIVE的一个默认函数
a.编写自己的UDF/UDAF/UDTF(如何编写可参考:http://hugh-wangp.iteye.com/blog/1472371),并把代码放到$HIVE_HOME/src/ql/src/java/org/apache/hadoop/hive/ql/udf/路径下
b.修改$HIVE_HOME/src/ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java
以HIVE自带函数Trim()举例,自定义函数操作一样。
第一步:
写UDF代码UDFTrim.java并放到$HIVE_HOME/src/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFTrim.java
第二步:
修改$HIVE_HOME/src/ql/src/java/org/apache/hadoop/hive/ql/exec/FunctionRegistry.java文件
a.import org.apache.hadoop.hive.ql.udf.UDFTrim;
b.registerUDF("trim", UDFTrim.class, false);

虽然这种方法是一劳永逸的方法,但是一旦错了,对整个HIVE使用都是灾难性的,所以不是特别通用的自定义函数还是采用前两种,一旦通用的自定义函数累计到一定程度,再去采用第三种方法。

 

转自:http://www.cnblogs.com/tangtianfly/archive/2012/11/06/2756745.html

分享到:
评论

相关推荐

    Spark不能使用hive自定义函数.doc

    ### Spark与Hive自定义函数兼容性问题解析 在大数据处理领域,Apache Spark 和 Apache Hive 都是非常重要的工具。Spark 是一种快速通用的大规模数据处理系统,而Hive 则是一种数据仓库工具,主要用于对存储在 ...

    hive自定义UDF编写函数.docx

    本文主要讲解了 Hive 中自定义 UDF 函数的编写方法,包括创建 UDF 类、实现自定义函数逻辑、编译和打包 UDF jar 包、上传至 Hive 服务器并注册自定义函数。 一、创建 UDF 类 为了实现自定义 UDF 函数,需要创建一...

    HIVE自定义UDF函数

    而自定义用户定义函数(UDF)是 Hive 中的一个重要功能,允许用户根据自己的需求编写自定义函数,以便在 Hive 查询中使用。 如何在 Hive 中创建自定义 UDF 函数: 步骤一:编写 Java 程序 首先,您需要编写一个 ...

    hive的自定义函数

    ### Hive的自定义函数(UDF)详解 #### 一、引言 在大数据处理领域,Apache Hive 是一个广泛使用的数据仓库工具,它提供了一种SQL-like查询语言——HiveQL,使用户能够轻松地对存储在Hadoop文件系统中的大规模数据...

    hive自定义函数demo

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

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

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

    Hive的Udf函数进行数据脱敏

    Hive 的 User Defined Functions (UDFs) 是用户自定义函数,允许开发者扩展Hive的功能,以满足特定的数据处理需求。在这个场景中,我们关注的是如何使用UDF进行数据脱敏,特别是对敏感信息进行处理,例如手机号码、...

    hive自定义udf函数实战

    udf函数,用户自定义函数,可以直接在sql语句中计算的函数 优点: 允许实现模块化的程序设计、方便修改代码、增加函数 UDF的执行速度很快,通过缓存计划在语句重复执行时降低代码的编译开销,比存储方法的执行效率...

    hive UDF需要jar包

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

    一些有用的自定义配置单元udf函数、特殊数组、json、数学、字符串函数。___下载.zip

    这些自定义函数可以是单行或者多行的,它们能够处理Hive内置函数无法满足的业务需求。例如,可能需要一个特殊的日期转换函数,或者一个能处理特定格式字符串的函数。文件`hive-third-functions-master`很可能包含了...

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

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

    hive-udf:hive自定义函数

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

    base64加密解密的hive udf函数

    本文将详细探讨如何在Hive中自定义User Defined Function(UDF)来实现Base64的加密和解密。 首先,我们需要了解Base64的基本原理。Base64是一种将任意二进制数据转化为ASCII字符集的方法,它通过将每3个字节转换为...

    Hive自定义函数

    【Hive自定义函数】是Hive为了满足用户在处理大数据时遇到的特定业务需求而提供的功能。在Hive的内置函数无法满足这些需求时,用户可以通过编写自定义函数(UDF)进行扩展。UDF全称为User Defined Function,允许...

    自定义hive函数

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

    * hive脱敏UDF函数 *对一些敏感信息进行脱敏处理,替换位置可自定义,脱敏符号可随机也可自定义

    * 脱敏UDF函数 * 功能:对一些敏感信息进行脱敏处理,替换方式可选择自定义替换,如'#','*'等,,如不指定脱敏符号,使用个随机字符替换 * 脱敏位置可自定义,不指定位置,会对数据进行全脱敏 * 例如身份证信息: ...

    hive-exec-udf

    而Hive的执行引擎和用户自定义函数(UDF)是其核心功能之一,它们共同构建了Hive的强大计算能力。本文将详细探讨Hive执行机制以及UDF的使用和开发。 一、Hive执行引擎 Hive执行引擎负责解析用户的HQL语句,将其...

    hive-udf(两地址间距离计算+省市区位置解析(Java代码))

    为了满足特定的业务需求,Hive提供了用户定义函数(UDF)的功能,允许用户自定义处理数据的逻辑。在这个“hive-udf”项目中,我们主要探讨的是如何利用Java编写UDF来实现两个地址间的距离计算以及省市区位置的解析。...

    各种情况手机号清洗udf函数(hive impala)

    3. **Hive UDF**:在Hive中,我们可以创建自定义函数(UDF)来处理特定的数据清洗任务。首先,你需要编写一个Java类,该类继承自`org.apache.hadoop.hive.ql.udf.generic.GenericUDF`,并实现`evaluate`方法,该方法...

    hive常用函数

    在本文中,我们将深入探讨Hive的常用函数,包括时间函数、类型转换函数、用户自定义函数(UDF)以及用户自定义聚合函数(UDAF)等。 关系运算符是Hive中的基础函数,用于比较两个值是否相等。例如,A=B用于判断A...

Global site tag (gtag.js) - Google Analytics