zoukankan      html  css  js  c++  java
  • Hive自定义函数的学习笔记(1)

    前言:
      hive本身提供了丰富的函数集, 有普通函数(求平方sqrt), 聚合函数(求和sum), 以及表生成函数(explode, json_tuple)等等. 但不是所有的业务需求都能涉及和覆盖到, 因此hive提供了自定义函数的接口, 方便用户扩展.
      自己好像很久没接触hadoop了, 也很久没博客了, 今天趁这个短期的项目, 对hive中涉及的自定义函数做个笔记.

    准备:
      编写hive自定义函数前, 需要了解下当前线上hive的版本.

    hive --vesion
    

      比如作者使用到的hive版本为:

    $ hive --version
    Hive 1.2.1

      具体编写的自定义函数所依赖的库最好和线上版本保持一致.
      使用maven组织工程的话, 如下所示:

    <dependency>
      <groupId>org.apache.hive</groupId>
      <artifactId>hive-exec</artifactId>
      <version>1.2.1</version>
    </dependency>

    编写代码:
      Hive中的UDF的设计思路是, 一具体类对应一具体函数.
      以最简单的大小写转换函数为例:

    package test.ql;
    import org.apache.hadoop.hive.ql.exec.UDF;
    
    public final class LowerUDF extends UDF {
    
      public String evaluate(String src) {
        if ( src == null ) {
          return "";
        }
        return src.toLowerCase();
      }
    
    }

      注: 继承于UDF类之后, 编写具体的evaluate函数即可. 这边evaluate感觉像基于名字的约定, 有待后续文章的分析和挖掘, ^_^.


    jar打包(非主流做法):
      使用maven直接打成jar包(非fat包), 这个非常容易. 因此这边装下逼, 使用一回石器时代的打包方式.
      hive的udf函数, 自然依赖于hive相关的jar包.
      在linux环境中:

    $ echo $HIVE_HOME
    /data/hadoop/hive

      或者使用

    $ locate *hive*jar
    data/hadoop/apache-hive-1.2.1-bin/lib/hive-common-1.2.1.jar
    /data/hadoop/apache-hive-1.2.1-bin/lib/hive-contrib-1.2.1.jar
    /data/hadoop/apache-hive-1.2.1-bin/lib/hive-exec-1.2.1.jar
    ....
    /data/hadoop/apache-hive-1.2.1-bin/lib/udf.jar
    ....

      都可以获取到, hive的jar库地址为/data/hadoop/apache-hive-1.2.1-bin/lib
      编写编辑脚本:

    #! /bin/bash
    
    # 
    HIVE_LIB="/data/hadoop/apache-hive-1.2.1-bin/lib/"
    
    # 遍历hive的jar库, 放置于classpath中去
    cp_libs=.
    for jarfile in $(ls ${HIVE_LIB} ); do
      cp_libs=${cp_libs}:${HIVE_LIB}/${jarfile}
    done
    
    mkdir -p build
    
    # 编译
    javac -cp ${cp_libs} LowerUDF.java -d build
    
    # 打包
    jar cvf lower.jar -C build .

      这样就可以出一个lower.jar的jar包了.

    临时函数的使用:
      进入hive的交互shell中
      1. 上传自定义udf的jar
      hive> add jar /path/to/lower.jar
      2. 创建临时函数
      hive> create temporary function xxoo_lower as 'test.ql.LowerUDF';
      3. 验证
      hive> select xxoo_lower("Hello World!");
      整个交互流程如下:
      

      不过这个临时函数, 其生命周期和hive的这个交互session保持一致, 一旦退出, 这个临时函数就消失了.


    永久函数的使用:
      1. 把自定义函数的jar上传到hdfs中.
      hdfs dfs -put lower.jar 'hdfs:///path/to/hive_func';
      2. 创建永久函数
      hive> create function xxoo_lower as 'test.ql.LowerUDF' using jar 'hdfs:///path/to/hive_func/lower.jar'
      3. 验证
      hive> select xxoo_lower("Hello World");
      hive> show functions;
      整个交互流程图如下:

      永久函数的删除也容易:
      hive> drop function xxoo_lower;

    总结:
      就如开头所讲的, 该文章纯粹为hive自定函数的学习实战笔记. 将来有机会, 好好研究一下hive自定义函数的类结构和设计模型, ^_^.

    个人站点&公众号:

      个人微信公众号: 小木的智慧屋

      个人游戏作品集站点(尚在建设中...): www.mmxfgame.com
  • 相关阅读:
    复习题之后缀表达式
    专项训练之枚举
    专项训练之二分
    深夜毒物
    笑面的学校日常(14)最近一次更新2017 04 06
    了不起的竞赛生(7)(最近一次更新2017 04 06)
    水题日常——动态规划 洛谷
    Bzoj 1926: [Sdoi2010]粟粟的书架(二分答案+乱搞+主席树)
    Cogs 1708. 斐波那契平方和(矩阵乘法)
    Codevs 1482 路线统计(矩阵乘法)
  • 原文地址:https://www.cnblogs.com/mumuxinfei/p/5939114.html
Copyright © 2011-2022 走看看