前言:
  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

Hive自定义函数的学习笔记(1)的更多相关文章

  1. hive自定义函数学习

    1介绍 Hive自定义函数包括三种UDF.UDAF.UDTF UDF(User-Defined-Function) 一进一出 UDAF(User- Defined Aggregation Funcat ...

  2. hive -- 自定义函数和Transform

    hive -- 自定义函数和Transform UDF操作单行数据, UDAF:聚合函数,接受多行数据,并产生一个输出数据行 UDTF:操作单个数据 使用udf方法: 第一种: add jar xxx ...

  3. hive自定义函数(UDF)

    首先什么是UDF,UDF的全称为user-defined function,用户定义函数,为什么有它的存在呢?有的时候 你要写的查询无法轻松地使用Hive提供的内置函数来表示,通过写UDF,Hive就 ...

  4. hive自定义函数UDF UDTF UDAF

    Hive 自定义函数 UDF UDTF UDAF 1.UDF:用户定义(普通)函数,只对单行数值产生作用: UDF只能实现一进一出的操作. 定义udf 计算两个数最小值 public class Mi ...

  5. R语言函数化学习笔记6

    R语言函数化学习笔记 1.apply函数 可以让list或者vector的元素依次执行一遍调用的函数,输出的结果是list格式 2.sapply函数 原理和list一样,但是输出的结果是一个向量的形式 ...

  6. R语言函数化学习笔记3

    R语言函数化学习笔记3 R语言常用的一些命令函数 1.getwd()查看当前R的工作目录 2.setwd()修改当前工作目录 3.str()可以输出指定对象的结构(类型,位置等),同理还有class( ...

  7. sqlserver -- 学习笔记(一)自定义函数(学习总结,备忘)

    SQL Server自定义函数,以前只在书上看过,没有动手去敲一敲,今天刚好接触到,看了几篇博文学习了下.做好备忘很重要!! (@_@)Y Learn from:http://www.cnblogs. ...

  8. JavaScript权威设计--JavaScript函数(简要学习笔记十一)

    1.函数调用的四种方式 第三种:构造函数调用 如果构造函数调用在圆括号内包含一组实参列表,先计算这些实参表达式,然后传入函数内.这和函数调用和方法调用是一致的.但如果构造函数没有形参,JavaScri ...

  9. JavaScript权威设计--JavaScript函数(简要学习笔记十)

    1.函数命名规范 函数命名通常以动词为前缀的词组.通常第一个字符小写.当包含多个单词时,一种约定是将单词以下划线分割,就像"like_Zqz()". 还有一种就是"lik ...

随机推荐

  1. Dependency Scope

    Dependency Scope <dependency>中还引入了<scope>,它主要管理依赖的部署.目前<scope>可以使用5个值: * compile,缺 ...

  2. LeetCode 6 ZigZag Conversion 模拟 难度:0

    https://leetcode.com/problems/zigzag-conversion/ The string "PAYPALISHIRING" is written in ...

  3. μC/OS-Ⅲ系统中的任务种类及基本状态

    在μC/OS-Ⅲ系统中,任务自身一共有五种状态. 1.休眠态 调用函数OSTaskCreate()创建任务后,任务就可以接受μC/OS-Ⅲ的管理.处于休眠态的任务代码实际上已经写入代码空间中了,但是μ ...

  4. RHEL7修改swappiness

    linux系统swappiness参数在内存与交换分区间优化 2014-08-14 10:24:19分类: Linux swappiness的值的大小对如何使用swap分区是有着很大的联系的.swap ...

  5. 利用Volley封装好的图片缓存处理加载图片

    Volley 工具箱中提供了一种通过 DiskBasedCache 类实现的标准缓存.这个类能够缓存文件到磁盘的指定目录.但是为了使用 ImageLoader,我们应该提供一个自定义的内存 LRC b ...

  6. dwg格式用什么打开

    dwg文件怎么打开?dwg格式用什么打开?如何打开dwg文件?今天小编在这里推荐几款控件可以实现打开预览编辑DWG格式文件的目的. CADViewX是一款强大的CAD文件以及图片浏览库,在不需要其他三 ...

  7. vim自动补全功能

    1.首先下载一个插件:ctags 输入:sudo apt-get install ctags 2.Ctrl+n进行单词的自动补全

  8. 详细讲解Linux驱动程序

    一  编写Linux驱动程序 1.建立Linux驱动骨架 Linux内核在使用驱动时需要装载与卸载驱动 装载驱动:建立设备文件.分配内存地址空间等:module_init 函数处理驱动初始化 卸载驱动 ...

  9. 遗传算法的C语言实现(一):以非线性函数求极值为例

    以前搞数学建模的时候,研究过(其实也不算是研究,只是大概了解)一些人工智能算法,比如前面已经说过的粒子群算法(PSO),还有著名的遗传算法(GA),模拟退火算法(SA),蚁群算法(ACA)等.当时懂得 ...

  10. C++调用V8与JS交互

    C++访问JS函数 C++部分: /** * COMPILE foo.js AT THE FIRST COMMAND PROMPT TO RUN foo.js */ #include <v8.h ...