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
Hive自定义函数的学习笔记(1)的更多相关文章
- hive自定义函数学习
1介绍 Hive自定义函数包括三种UDF.UDAF.UDTF UDF(User-Defined-Function) 一进一出 UDAF(User- Defined Aggregation Funcat ...
- hive -- 自定义函数和Transform
hive -- 自定义函数和Transform UDF操作单行数据, UDAF:聚合函数,接受多行数据,并产生一个输出数据行 UDTF:操作单个数据 使用udf方法: 第一种: add jar xxx ...
- hive自定义函数(UDF)
首先什么是UDF,UDF的全称为user-defined function,用户定义函数,为什么有它的存在呢?有的时候 你要写的查询无法轻松地使用Hive提供的内置函数来表示,通过写UDF,Hive就 ...
- hive自定义函数UDF UDTF UDAF
Hive 自定义函数 UDF UDTF UDAF 1.UDF:用户定义(普通)函数,只对单行数值产生作用: UDF只能实现一进一出的操作. 定义udf 计算两个数最小值 public class Mi ...
- R语言函数化学习笔记6
R语言函数化学习笔记 1.apply函数 可以让list或者vector的元素依次执行一遍调用的函数,输出的结果是list格式 2.sapply函数 原理和list一样,但是输出的结果是一个向量的形式 ...
- R语言函数化学习笔记3
R语言函数化学习笔记3 R语言常用的一些命令函数 1.getwd()查看当前R的工作目录 2.setwd()修改当前工作目录 3.str()可以输出指定对象的结构(类型,位置等),同理还有class( ...
- sqlserver -- 学习笔记(一)自定义函数(学习总结,备忘)
SQL Server自定义函数,以前只在书上看过,没有动手去敲一敲,今天刚好接触到,看了几篇博文学习了下.做好备忘很重要!! (@_@)Y Learn from:http://www.cnblogs. ...
- JavaScript权威设计--JavaScript函数(简要学习笔记十一)
1.函数调用的四种方式 第三种:构造函数调用 如果构造函数调用在圆括号内包含一组实参列表,先计算这些实参表达式,然后传入函数内.这和函数调用和方法调用是一致的.但如果构造函数没有形参,JavaScri ...
- JavaScript权威设计--JavaScript函数(简要学习笔记十)
1.函数命名规范 函数命名通常以动词为前缀的词组.通常第一个字符小写.当包含多个单词时,一种约定是将单词以下划线分割,就像"like_Zqz()". 还有一种就是"lik ...
随机推荐
- 【图像处理】【SEED-VPM】2.接口
—————————————————————————————————————————————————————————————— 对比 ①最好是HDMI: ②分量也是高清的范围,得是比点对点的HDMI低一 ...
- 一款新的PYTHON数据科学利器:yhat
偶然看文章发现的一个新的python IDE,外表很清新,也很新颖. https://www.yhat.com/products/rodeo 看图说话,软件的布局确实很新颖,和Notebook类似,也 ...
- 几种排序算法的学习,利用Python和C实现
之前学过的都忘了,也没好好做过总结,现在总结一下. 时间复杂度和空间复杂度的概念: 1.空间复杂度:是程序运行所以需要的额外消耗存储空间,一般的递归算法就要有o(n)的空间复杂度了,简单说就是递归集算 ...
- curl方法post一个数组
$r = $this->curl_post($url, $data);$list = json_decode($r,true); function curl_post($url = '', ...
- linux tar命令的使用
tar格式,会打包成一个文件,可以对多个目录,或者多个文件进行打包 tar命令只是打包,不会压缩,打包前后大小是一样的 tar命令 -c //打包 -x //解压 -f //指定文件 ...
- ldap日志
要开启openldap的日志功能是非常简单的:1.在slapd.conf中加一行:loglevel 4095 2.在/etc/rsyslog.conf 中加入ldap日志文档: ...
- sublime text 3 快捷键大全
Sublime Text 3 快捷键精华版 Ctrl+Shift+P:打开命令面板Ctrl+P:搜索项目中的文件Ctrl+G:跳转到第几行Ctrl+W:关闭当前打开文件Ctrl+Shift+W:关闭所 ...
- 安全协议系列(五)---- IKE 与 IPSec(上)
IKE/IPSec 属于网络层安全协议,保护 IP 及上层的协议安全.自上个世纪末面世以来,关于这两个协议的研究.应用,已经非常成熟.协议本身,也在不断地进化.仅以 IKE 为例,其对应的 RFC 编 ...
- vs2008下面wince错误MSDiscoCodeGenerator
引用webservice时候错误.网上也有很多解决方法,各不相同. 不多说了. 打开vs2008安装包 找到wcu目录下面有个NetCF 目录: 下面的NetCFSetupv2.msi,NetCFSe ...
- Question Of Rabbit
题目描述 f(n) = GCD(1, n) + GCD(2, n) + GCD(3, n) + ~ ~ ~ + GCD(n - 1, n). 输入 每行一个整数N (1 < N < 400 ...