hive 学习系列四(用户自定义函数)
如果入参是简单的数据类型,直接继承UDF,实现一个或者多个evaluate 方法。
具体流程如下:
1,实现大写字符转换成小写字符的UDF
package com.example.hive.udf;
import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.io.Text;
public class Lower extends UDF {
public Text evaluate(final Text s) {
if (s == null) {
return null;
}
return new Text(s.toString().toLowerCase());
}
}
2,打包成jar 包。
建立maven 项目,使用maven 打包。
这里打包成的jar 包是,hiveudf-1.0.0.jar
3,上传到hdfs 路径上。
[root@master /opt]# hadoop fs -mkdir -p /user/hive/udf
18/06/07 09:41:09 WARN util.NativeCodeLoader: Unable
to load native-hadoop library for your platform... using builtin-java classes where applicable
[root@master /opt]# hadoop fs -put hiveudf-1.0.0.jar /user/hive/udf
18/06/07 09:41:24 WARN util.NativeCodeLoader: Unable to
load native-hadoop library for your platform... using builtin-java classes where applicable
[root@master /opt]# hadoop fs -ls /user/hive/udf
18/06/07 09:41:47 WARN util.NativeCodeLoader: Unable to load native-hadoop library
for your platform... using builtin-java classes where applicable
Found 1 items
-rw-r--r-- 3 root supergroup 8020 2018-06-07 09:41 /user/hive/udf/hiveudf-1.0.0.jar
[root@master /opt]#
4, 在Hive 命令行里面创建函数。
add jar hdfs:////udf/hiveudf-1.0.0.jar;
create temporary function lower as 'com.example.hive.udf.Lower';
hive> delete jar hiveudf-1.0.0.jar;
hive> list jars
> ;
hive> add jar hdfs:///user/hive/udf/hiveudf-1.0.0.jar
> ;
Added [/tmp/416cfcca-9ea0-4eaf-9e54-8154b440f3a9_resources/hiveudf-1.0.0.jar] to class path
Added resources: [hdfs:///user/hive/udf/hiveudf-1.0.0.jar]
hive> list jars;
/tmp/416cfcca-9ea0-4eaf-9e54-8154b440f3a9_resources/hiveudf-1.0.0.jar
hive> create temporary function lower as 'com.example.hive.udf.Lower';
OK
Time taken: 0.594 seconds
hive>
5,然后就可以用这个注册的函数了。
hive> select lower('AbcDEfg')
> ;
OK
abcdefg
Time taken: 1.718 seconds, Fetched: 1 row(s)
hive>
至于入参是复杂数据类型,比如Array 等, 可以继承GenericUDF
1,同样的,先写一个类,继承GenericUDF,
此自定义函数实现的是,把一个点,根据经纬度,转换成一个字符串。
package com.zbra.udf;
import org.apache.hadoop.hive.ql.exec.UDFArgumentException;
import org.apache.hadoop.hive.ql.exec.UDFArgumentLengthException;
import org.apache.hadoop.hive.ql.metadata.HiveException;
import org.apache.hadoop.hive.ql.udf.generic.GenericUDF;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.primitive.DoubleObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory;
/**
* 针对复杂数据
*/
public class GeoUdf extends GenericUDF {
private DoubleObjectInspector doubleObjectInspector01;
private DoubleObjectInspector doubleObjectInspector02;
public ObjectInspector initialize(ObjectInspector[] objectInspectors) throws UDFArgumentException {
if (objectInspectors.length != 2) {
throw new UDFArgumentLengthException("arrayContainsExample only takes 2 arguments: String, String");
}
// 1. 检查是否接收到正确的参数类型
ObjectInspector a = objectInspectors[0];
ObjectInspector b = objectInspectors[1];
if (!(a instanceof DoubleObjectInspector) || !(b instanceof DoubleObjectInspector)) {
throw new UDFArgumentException("first argument must be a double, second argument must be a double");
}
this.doubleObjectInspector01 = (DoubleObjectInspector) a;
this.doubleObjectInspector02 = (DoubleObjectInspector) b;
return PrimitiveObjectInspectorFactory.javaStringObjectInspector;
}
public Object evaluate(DeferredObject[] deferredObjects) throws HiveException {
Double lat = this.doubleObjectInspector01.get(deferredObjects[0].get());
Double lng = this.doubleObjectInspector02.get(deferredObjects[1].get());
if (lat == null || lng == null) {
return new String("");
}
return new GeoHash(lat, lng).getGeoHashBase32();
}
public String getDisplayString(String[] strings) {
if (strings.length == 2) {
return "geo_hash(" + strings[0] + ", " + strings[1] + ")";
} else {
return "传入的参数不对...";
}
}
}
2,打包成jar 包
本文中打包成hiveudf-1.0.0.jar
3,同样的上传到hdfs 路径中
[root@master /opt]# hadoop fs -mkdir -p /user/hive/udf
18/06/07 09:41:09 WARN util.NativeCodeLoader: Unable
to load native-hadoop library for your platform... using builtin-java classes where applicable
[root@master /opt]# hadoop fs -put hiveudf-1.0.0.jar /user/hive/udf
18/06/07 09:41:24 WARN util.NativeCodeLoader: Unable to
load native-hadoop library for your platform... using builtin-java classes where applicable
[root@master /opt]# hadoop fs -ls /user/hive/udf
18/06/07 09:41:47 WARN util.NativeCodeLoader: Unable to load native-hadoop library
for your platform... using builtin-java classes where applicable
Found 1 items
-rw-r--r-- 3 root supergroup 8020 2018-06-07 09:41 /user/hive/udf/hiveudf-1.0.0.jar
[root@master /opt]#
4, 创建自定义函数。
hive> list jars;
/tmp/3794df3a-687a-45dd-93d3-d6a712c43e85_resources/hiveudf-1.0.0.jar
hive> delete jar /tmp/3794df3a-687a-45dd-93d3-d6a712c43e85_resources/hiveudf-1.0.0.jar
> ;
Deleted [/tmp/3794df3a-687a-45dd-93d3-d6a712c43e85_resources/hiveudf-1.0.0.jar] from class path
hive> add jar hdfs:///user/hive/udf/hiveudf-1.0.0.jar;
Added [/tmp/3794df3a-687a-45dd-93d3-d6a712c43e85_resources/hiveudf-1.0.0.jar] to class path
Added resources: [hdfs:///user/hive/udf/hiveudf-1.0.0.jar]
hive> create temporary function geohash as 'com.zbra.udf.GeoUdf';
OK
Time taken: 0.145 seconds
5, 使用如下:
hive> select geohash(12.0d, 123.0d);
OK
wdpkqbtc
Time taken: 0.8 seconds, Fetched: 1 row(s)
hive> select geohash(cast('12' as Double), cast('123' as Double));
OK
wdpkqbtc
Time taken: 0.733 seconds, Fetched: 1 row(s)
hive>
hive 学习系列四(用户自定义函数)的更多相关文章
- scrapy爬虫学习系列四:portia的学习入门
系列文章列表: scrapy爬虫学习系列一:scrapy爬虫环境的准备: http://www.cnblogs.com/zhaojiedi1992/p/zhaojiedi_python_00 ...
- DocX开源WORD操作组件的学习系列四
DocX学习系列 DocX开源WORD操作组件的学习系列一 : http://www.cnblogs.com/zhaojiedi1992/p/zhaojiedi_sharp_001_docx1.htm ...
- .net reactor 学习系列(四)---.net reactor应用场景
原文:.net reactor 学习系列(四)---.net reactor应用场景 前面已经学习了.net reactor一些基础知识,现在准备学习下实际的应用场景,只是简单的保护和 ...
- opencv-python教程学习系列4-opencv绘图函数
前言 opencv-python教程学习系列记录学习python-opencv过程的点滴,本文主要介绍opencv绘图函数,坚持学习,共同进步. 系列教程参照OpenCV-Python中文教程: 系统 ...
- Hive学习 系列博客
原 Hive作业优化 原 Hive学习六:HIVE日志分析(用户画像) 原 Hive学习五--日志案例分析 原 Hive学习三 原 Hive学习二 原 Hive学习一 博客来源,https://blo ...
- Spark SQL概念学习系列之用户自定义函数
不多说,直接上干货! 用户自定义函数 注册udf 我们可以使用Spark 支持的编程语言编写好函数,然后通过Spark SQL 内建的方法传递进来,非常便捷地注册我们自己的UDF 在Scala 和Py ...
- Identity Server4学习系列四之用户名密码获得访问令牌
1.简介 Identity Server4支持用户名密码模式,允许调用客户端使用用户名密码来获得访问Api资源(遵循Auth 2.0协议)的Access Token,MS可能考虑兼容老的系统,实现了这 ...
- hive 学习系列之七 hive 常用数据清洗函数
1,case when 的利用,清洗诸如评分等的内容,用例如下. case when new.comment_grade = '五星商户' then 50 when new.comment_grade ...
- Vue学习系列(四)——理解生命周期和钩子
前言 在上一篇中,我们对平时进行vue开发中遇到的常用指令进行归类说明讲解,大概已经学会了怎么去实现数据绑定,以及实现动态的实现数据展示功能,运用指令,可以更好更快的进行开发.而在这一篇中,我们将通过 ...
随机推荐
- win7下tomcat5.5无法通过ip和127.0.0.1访问的解决方法
解决办法:找到tomcat5.5目录下的conf\server.xml文件,原文如下: <Connector port="8080" maxHttpHeaderSize=&q ...
- 关联关系的CRUD
关联关系中的CRUD_Cascade_Fetch 1. hibernate_1700_one2many_many2one_bi_crud 2. 设定 cascade 可以设定在持久化时对于关联对象的操 ...
- 两种计算Java对象大小的方法
之前想研究一下unsafe类,碰巧在网上看到了这篇文章,觉得写得很好,就转载过来.原文出处是: http://blog.csdn.net/iter_zc/article/details/4182271 ...
- HTML <meta> Attribute
HTML <meta> Attribute http-equiv 定义和用法 The http-equiv attribute provides an HTTP header for th ...
- 深入理解linux源码安装三板斧
概述: 根据源码包中 Makefile.in 文件的指示,configure 脚本检查当前的系统环境和配置选项,在当前目录中生成 Makefile 文件(还有其它本文无需关心的文件),然后 make ...
- python入门22 pymssql模块(python连接sql server查询)
安装 pip install pymssql 连接数据库 pymssql.connect() # coding:utf-8 import pymssql server = '192.168.8.1' ...
- 确定浏览器是否支持某些DOM模块
var supportDOM2Core = document.implementation.hasFeature("Core","2.0"); var supp ...
- bzoj3816 矩阵变换
Description 给出一个 N 行 M 列的矩阵A, 保证满足以下性质: M>N. 矩阵中每个数都是 [0,N] 中的自然数. 每行中, [1,N] 中每个自然数都恰好出现一次.这意味着每 ...
- 将psd格式批量转换成jpg或png格式(C#自制软件)
此项目基于.net framework 4.0 将psd格式批量转换成jpg或png格式. 链接:https://pan.baidu.com/s/16IEjX0sHaY9H3Ah7mv6IPQ 提取码 ...
- mybatis学习记录六——一对一、一对多和多对多查询
9 订单商品数据模型 9.1 数据模型分析思路 1.每张表记录的数据内容 分模块对每张表记录的内容进行熟悉,相当 于你学习系统 需求(功能)的过程. 2.每张表重要的字段设置 非空 ...