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

深入学习《Programing Hive》:Hive自定义函数之UDF

    博客分类:
  • Hive
阅读更多
        为了满足用户的个性化需求,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文件中的数据集:
              edward capriolo,edward@media6degrees.com,2-12-1981,209.191.139.200,M,10
              bob,bob@test.net,10-10-2004,10.10.10.1,M,50
              sara connor,sara@sky.net,4-5-1974,64.64.5.1,F,2
              ...
        

        接下来我们顶一个Hive加载这个数据集:
              hive> CREATE TABLE IF NOT EXISTS littlebigdata(
                  >   name        STRING COMMENT '姓名',
                  >   email       STRING COMMENT '邮箱',
                  >   birthday    STRING COMMENT '生日',
                  >   ip          STRING COMMENT 'ip',
                  >   gender      STRING COMMENT '性别',
                  >   anum        INT)
                  > ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';

              hive> LOAD DATA LOCAL INPATH '${env:HOME}/littlebigdata.txt'
                  > INTO TABLE littlebigdata;
        

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

          import java.text.SimpleDateFormat;
          import java.util.Date;
          import org.apache.hadoop.hive.ql.exec.UDF;
          import org.apache.hadoop.hive.ql.exec.Description;
          
          @Description(name = "Zodiac",
             value = "FUNC_(date) - from the input data string " +
                     "or separate month and day arguments,return the sign of the Zodiac.",
             extended = "Example:\n >SELECT _FUNC_(date_string) FROM src;\n" + 
                        " > SELECT _FUNC_(month,day) FROM src;")
          public class ZodiacSignUDF extends UDF{
               private SimpleDateFormat df = null;
    
               /**
                * 在默认构造函数中初始化df
                */
               public ZodiacSignUDF(){
                   df = new SimpleDateFormat("MM-dd-yyyy");
               }
           
               /**
                * 由出生日期获取星座
                * @param birthday -Date
                * @return
                */
               public String evaluate(Date birthday){
                   return this.evaluate(birthday.getMonth() + 1,birthday.getDay());
               }

               /**
                * 由出生日期获取星座
                * @param birthday -String
                * @return
                */
               public String evaluate(Date birthday){
                   Date date = null;
                   try{
                      date = df.parse(birthday);
                   }catch(Excetion e){
                       //如果日期转换失败,就表明星座是未知的
                       return null;
                   }
                   return this.evaluate(date.getMonth() + 1,date.getDay());
               }
               
               /**
                * 由月份和出生日获取星座
                * @param month -int
                * @param day -int
                * @return
                */
               public String evaluate(Integer month,Integer day){
                   if(month == 1){
                      if(day < 20){
                         return "Capricorn";
                      }else{
                         return "Aquarius";
                      }
                   }else if(month == 2){
                      if(day < 19){
                         return "Aquarius";
                      }else{
                         return "Pisces";
                      }
                   }
                   /** ... other months here */
                   return null;
               }
          }
        

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

        那么接下来的问题是如何使用这个自定义函数呢?
        首先需要用户便以这个类并将之打成一个jar包,然后将jar文件添加到Hive的classpath并使用CREATE FUNCTION语句将之定义为一个Hive能使用的方法:
              hive> ADD JAR /full/path/to/zodiac.jar;
              hive> CREATE TEMPORARY FUNCTION zodiac 
                    AS 'org.apache.hadoop.hive.contrib.udf.exampl.ZodiacSignUDF';           
        

        当然,上面的函数添加方法只能在Hive session会话期间使用,session结束后如还想使用该函数,那就必须再将上面的两部操作做一遍。如果这个函数是经常使用的,那么这么做就太繁琐了,这种情况下可以把上面的两操作语句添加到$HOME/.hiverc文件中作为全局函数,就想使用hive的内置行是一样:
              hive> SELECT name,birthday,zodiac(birthday) FROM littlebigdata;
              edward capriolo 2-12-1981   Aquarius
              bob             10-10-2004  Libra
              sara            4-5-1974    Aries
        


        接着我们来看怎么删除一个·自定义函数:
              hive> DROP TEMPORARY FUNCTION IF EXISTS zodiac;
        
分享到:
评论

相关推荐

    HIVE编程指南

    HIVE编程指南中文版,是由programing hive翻译过来

    Hive编程中文版

    Hive编程指南中文版翻译,Hive programing

    matlab导入excel代码-functional_programing_workshop:InsightDataScience的函数式编程

    matlab导入excel代码只懂Python的数据科学家的函数式编程 功能编程 历史简介 在1920年代和1930年代,有两种计算理论。 图灵机(艾伦·图灵(Alan Turing),1932年) 基于物理(尽管理论上)机器的逐步计算模型。 ...

    Programing1:编程的最终评估1

    在编程领域,编程1通常指的是初学者阶段的学习与实践,主要涵盖了基础的编程概念、语法和逻辑思维。在这个“编程的最终评估1”中,我们可以期待一个总结性的任务或者项目,目的是检验学习者对基本编程知识的理解和...

    leetcode手册JAVA-test-programing-:测试-编程-

    只要它可以帮助正在学习新算法的人,它是否从某个地方复制并不重要。 图形示例也将非常有帮助。 不要忘记包括测试。 不要删除以前的算法实现。 只需使用您自己的实现添加一个新文件。 美化和清理您的代码以便于阅读...

    hive-programing

    直线-u'jdbc:hive2:// headnodehost:10001 /; transportMode = http'-f demo.hql #this用于将txt文件存储在azure中 直线-u'jdbc:hive2:// headnodehost:10001 /; transportMode = ...

    Programing with MFC Programing with MFC

    《Programming with MFC》是关于Microsoft Foundation Classes (MFC) 的编程指南,MFC 是微软为Windows应用程序开发提供的...通过深入学习MFC,开发者可以更好地理解和控制Windows应用程序的生命周期,提高开发效率。

    how to programing c source_code

    "how to programming c source_code"这个主题聚焦于如何学习和理解C语言的源代码,这对于任何想要深入计算机科学的人来说都是一个宝贵的资源。这本书中的代码实例可以帮助你更好地掌握C语言的核心概念和编程技巧。 ...

    C-programing.rar_C programing答案

    通过参考"压缩包子文件的文件名称列表"中的"C programing",我们可以推测这个压缩包可能包含了C语言编程的实例代码,这些代码可以用来演示上述知识点的应用,帮助学习者更好地理解和实践C语言编程。如果对某个特定的...

    c++ programing and c

    c++ programingc++ programing and cc++ programing and cc++ programing and cc++ programing and cc++ programing and cc++ programing and cc++ programing and cc++ programing and cc++ programing and cc++ ...

    Python-programing:Python代码

    以上只是Python编程中的一些基础知识点,Python的生态庞大,还有更多高级特性和框架,如网络编程、并发处理、网络爬虫、机器学习、深度学习等,都需要进一步深入学习。Python-programing-main这个压缩包可能包含了...

    The C Programing language

    根据提供的文件信息,实际内容与要求的C编程语言知识点不符,该文件内容为一份小品剧本,因此将基于剧本中的元素进行无关内容的剔除,接下来将围绕...掌握这些基础概念对于学习更高级的语言和技术也是非常有帮助的。

    The c programing language

    这本书被誉为理解C语言的必备读物,对全球程序员产生了深远影响,被誉为"C语言的四书五经"之一。C语言是一种强大的、高效的编程语言,广泛应用于系统编程、嵌入式系统、软件开发以及各种计算任务。 C语言的特点主要...

    Python-Programing-Projects:适用于CPE-101类的CalPoly-SLO Python项目

    通过一系列精心设计的实践项目,学生将学习到Python的基础语法、数据结构、控制流、函数、模块化编程以及错误处理等核心概念。这些项目不仅有助于巩固理论知识,还能提高问题解决和逻辑思维能力。 1. **Python基础*...

    the c programing

    根据提供的文件信息,我们可以梳理出该书籍主要涵盖了C语言编程...综上所述,本书籍系统地介绍了C语言的基础知识与高级特性,不仅适合初学者学习C语言的基本语法,也适用于有一定经验的开发者深入了解C语言的高级用法。

    C++ programing language知识整理(rar)

    以下是对"C++ programing language"知识的详细整理: 1. **基础语法**:C++的基础语法与C语言类似,包括变量声明、数据类型(如int、float、char)、运算符、流程控制(如if-else、for、while、switch-case)等。 ...

    the c programing language

    本书旨在为初学者提供全面而深入的C语言基础教学,同时也适合有一定编程经验的人士参考学习。 #### 二、第一章:C语言入门教程 - **起步**:介绍如何开始编写第一个C程序。 - **变量与算术表达式**:讲解变量的概念...

Global site tag (gtag.js) - Google Analytics