hive 虽然自带了很多函数,但是毕竟有限,无法满足所有业务场景,用户可以自定义函数来实现特定功能

UDF

user define function,用户自定义函数

可以分为 3 类

UDF:一进一出

UDAF:聚集函数,多进一出,user define aggregation function

UDTF:炸裂函数,一进多出

UDF 可以用多种语言实现,如 java、python、hive

准备工作

建表

create external table person(
name string,
idcard string)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
STORED as TEXTFILE;

外建表,还记得吗?

外建表不能 truncate 清空,如果是 drop 删表,只删除元数据,hdfs 中的数据还在

写入如下数据

neil    411326199402110030
pony 41132519950911004x
jcak 12312423454556561
tony 412345671234908

Hive Function

即用 hql 来实现 function,这是最简单的,写完 function 直接运行 sql 就行了

select idcard,
case when length(idcard) = 18 then
case when substring(idcard,-2,1) % 2 = 1 then '男'
when substring(idcard,-2,1) % 2 = 0 then '女'
else 'unknown' end
when length(idcard) = 15 then
case when substring(idcard,-1,1) % 2 = 1 then '男'
when substring(idcard,-1,1) % 2 = 0 then '女'
else 'unknown' end
else '不合法' end
from person;

Python UDF

python 也毕竟简单,类似于 mapreduce

# -*- coding: utf-8 -*-
import sys for line in sys.stdin:
detail = line.strip().split("\t")
if len(detail) != 2:
continue
else:
name = detail[0]
idcard = detail[1]
if len(idcard) == 15:
if int(idcard[-1]) % 2 == 0:
print("\t".join([name,idcard,"女"]))
else:
print("\t".join([name,idcard,"男"]))
elif len(idcard) == 18:
if int(idcard[-2]) % 2 == 0:
print("\t".join([name,idcard,"女"]))
else:
print("\t".join([name,idcard,"男"]))
else:
print("\t".join([name,idcard,"身份信息不合法!"]))

输入就是 hive 表的每一行

本地测试 UDF

直接在 hive 上测试比较麻烦,我们可以在本地测试下 UDF 写的是否正确,直接命令行即可

cat person.txt|python person.py

hive 中使用 UDF

在 hive 中使用 python 编写的 UDF 需要借助 transform 函数,语法如下

SELECT TRANSFORM (<columns>)
USING 'python <python_script>'
AS (<columns>)
FROM <table>;

顾名思义,就是用 python 脚本来转换 某列 生成新的列作为输出

第一步:加载 py 文件

在 hive 中执行如下代码

add file /xxx/udf1.py

xxx 为本地路径;

注意在每次启动 hive 后都要重新加载

第二步:使用 UDF 查询

select transform(name,idcard) USING 'python udf1.py'  AS (name,idcard,gender) from person;
neil    411326199402110030    男
pony 41132519950911004x 女
jcak 12312423454556561 身份信息不合法!
tony 412345671234908 女

vs1

select transform(name,idcard) USING 'python udf1.py'  AS (name,idcard) from person;
neil    411326199402110030
pony 41132519950911004x
jcak 12312423454556561
tony 412345671234908

vs2

select transform(name) USING 'python udf1.py'  AS (name,idcard,gender) from person;

可执行,但是无输出

转换的列和输出的列在一定程度上保持一致

python UDF 是效率比较低的,因为python 直接向系统请求资源,而不是通过 yarn 的 rm 申请,对资源的利用率较低

Java UDF

见官网

参考资料:

https://cwiki.apache.org/confluence/display/hive/hiveplugins  官网  java 用法

https://blog.csdn.net/qq_26937525/article/details/54136317

https://blog.csdn.net/liu82327114/article/details/80670415  讲述了 python udf 的缺点

Hive 教程(十)-UDF的更多相关文章

  1. CRL快速开发框架系列教程十二(MongoDB支持)

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

  2. CRL快速开发框架系列教程十(导出对象结构)

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

  3. 无废话ExtJs 入门教程十九[API的使用]

    无废话ExtJs 入门教程十九[API的使用] extjs技术交流,欢迎加群(201926085) 首先解释什么是 API 来自百度百科的官方解释:API(Application Programmin ...

  4. 无废话ExtJs 入门教程十六[页面布局:Layout]

    无废话ExtJs 入门教程十六[页面布局:Layout] extjs技术交流,欢迎加群(201926085) 首先解释什么是布局: 来自百度词典的官方解释:◎ 布局 bùjú: [distributi ...

  5. 无废话ExtJs 入门教程十五[员工信息表Demo:AddUser]

    无废话ExtJs 入门教程十五[员工信息表Demo:AddUser] extjs技术交流,欢迎加群(201926085) 前面我们共介绍过10种表单组件,这些组件是我们在开发过程中最经常用到的,所以一 ...

  6. 无废话ExtJs 入门教程十四[文本编辑器:Editor]

    无废话ExtJs 入门教程十四[文本编辑器:Editor] extjs技术交流,欢迎加群(201926085) ExtJs自带的编辑器没有图片上传的功能,大部分时候能够满足我们的需要. 但有时候这个功 ...

  7. 无废话ExtJs 入门教程十二[下拉列表联动:Combobox_Two]

    无废话ExtJs 入门教程十二[下拉列表联动:Combobox_Two] extjs技术交流,欢迎加群(201926085) 不管是几级下拉列表的联动实现本质上都是根据某个下拉列表的变化,去动态加载其 ...

  8. 无废话ExtJs 入门教程十[单选组:RadioGroup、复选组:CheckBoxGroup]

    无废话ExtJs 入门教程十[单选组:RadioGroup.复选组:CheckBoxGroup] extjs技术交流,欢迎加群(201926085) 继上一节内容,我们在表单里加了个一个单选组,一个复 ...

  9. Unity3D脚本中文系列教程(十六)

    Unity3D脚本中文系列教程(十五) ◆ function OnPostprocessAudio (clip:AudioClip):void 描述:◆  function OnPostprocess ...

随机推荐

  1. ansible主机互信

    前文讲了ansible,但是ansible是基于ssh来做的,首先的和管理主机之间做主机互信,简单来说主机互信就是把主机上产生的公钥传到互信主机上就可以了. 在主机上产生公钥文件.使用命令:ssh-k ...

  2. shell编程-定时删除(30天)文件

    1.创建shell touch /opt/auto-del-30-days-ago.sh chmod +x auto-del-30-days-ago.sh 2.编辑shell脚本: vi auto-d ...

  3. Go 结构体与初始化

    Go 通过类型别名(alias types)和结构体的形式支持用户自定义类型. 结构体是复合类型,当需要定义类型,它由一系列属性组成,每个属性都有自己的类型和值的时候,就应该使用结构体,它把数据聚集在 ...

  4. 【黑马JavaWeb】.1.2反射机制

    文章目录 反射:框架设计的灵魂 获取Class类对象的方式 学习视频:https://www.bilibili.com/video/av47886776?p=10 本来一万行的代码,使用框架以后简化到 ...

  5. C# how to properly make a http web GET request

    C# how to properly make a http web GET request EDIT 23/11/17 Updated to throw out examples using asy ...

  6. .net 查壳工具

    请问大神.NET查壳工具都有哪些? 已知的有DotNet Id    除了这个还有别的吗?脱MAXTOCODE发现是双壳.脱掉第一层还有一层,DotNet Id检测没壳了,但是反编译还是加密状态. 用 ...

  7. websphere部署不能发布war文件,提示“配置库中已存在应用程序

    碰上这种问题, 要是全删除与war相关配置文件,要么按网上教程,一点点搜下面的文件中包含的相关文件: $WAS_HOME/profiles/AppSrv01/config/cells/...cell/ ...

  8. PHP AJAX 返回JSON 数据

    例子:利用AJAX返回JSON数据,间接访问数据库,查出Nation 表,并用下拉列表显示 造一个外部下拉列表框 </select> JQurey代码 $(document).ready( ...

  9. 2018年第一记:EDM策略分享-EDM营销的策略分析

    很久没有上博客园来更新下文章了,一则因为工作繁忙,二则对技术方面的研究时间花的少了,目前主要侧重于EDM营销方面的策略制定.很多人跟我说,做EDM营销都茫然无头绪,那么做EDM到底有什么策略呢?下面博 ...

  10. tfserving 调用deepfm 并预测 java 【参考】

    https://blog.csdn.net/luoyexuge/article/details/79941565?utm_source=blogxgwz8 首先是libsvm格式数据生成java代码, ...