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开发中遇到的常用指令进行归类说明讲解,大概已经学会了怎么去实现数据绑定,以及实现动态的实现数据展示功能,运用指令,可以更好更快的进行开发.而在这一篇中,我们将通过 ...
随机推荐
- oracle_How to Recover Data (Without a Backup!)
How to Recover Data (Without a Backup!) It's the classic career-limiting maneuver(职业限制机动): accidenta ...
- 一点一点学写Makefile(3)-增加第三方库和头文件
我们在写代码的时候不一定都是有自己来完成,一个工程中会大量使用一些比较优秀的动态库.静态库等,我们在使用这些库完成所有的代码后,需要在编译的时候将这些库使用的头文件添加到我们的工程上,将他的库文件也添 ...
- 将springboot打包成的jar文件做成windows服务
1.在idea中用maven将程序打成jar,放到运行的目录中. 2.去github上面下载winsw: https://github.com/kohsuke/winsw/releases 3. 将W ...
- NO.007-2018.02.12《白头吟》两汉:卓文君
白头吟_古诗文网_解析_鉴赏_赏析 白头吟 两汉:卓文君 白头吟:乐府<楚调曲>调名.据<西京杂记>卷三载,蜀地巨商卓王孙的女儿卓文君,聪明美丽,有文采,通音乐.孀居在家时,与 ...
- Snippets代码块分享网站
复习时,看老师之前贴在网上的一些代码,顺便搜集了一些代码块Snippets分享网站 http://paste.ubuntu.com/ 简约简单,一如既往Linux风,我之前用的也是这款,但已转gite ...
- ShellSort uva
ShellSort He made each turtle stand on another one's back And he piled them all up in a nine-turtle ...
- ACM-ICPC(11/9)
今天看了一下黑书,感觉很刘汝佳,是他的风格,题目挺好的~~~ 枚举 P12翻硬币 二进制枚举每一列的情况2^9种. 在每一种情况下然后对于每一行就是翻与不翻的两种情况~~~ 贪心 P13钓鱼问题 PO ...
- 【洛谷P2426】删数
删数 题目链接 一道裸的区间DP,f[l][r]表示剩下区间[l,r]时的最大价值 可以由f[1~l-1][r]和f[l][r+1~n]转移过来 详见代码: #include<algorithm ...
- mssql数据库迁移到mysql
使用mysql migration toolkit工具来进行迁移.(需要安装jdk6 java的安装包) 发现数据量大的表却没能迁过来.软件使用比较容易,配置下源数据库信息,和目标数据库信息就可以进行 ...
- webpack4——打包html报错解决
①先引入html-webpack-plugin插件,然后在终端下载 npm install --save-dev html-webpack-plugin ②我的文件结构 ③修改webpack.dev. ...