python的udf编写例子
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
python的udf编写例⼦
简介
Hive为我们提供了众多的内置函数,但是在实际的运⽤过程中仍然不能满⾜我们所有的需求.hive是⽤java开发的,本⾝提供了使⽤java去开发UDF的⽅式.⽽这⾥我们采⽤python的⽅式去实现UDF函数.
DEMO实现
我们这⾥⽤python⾃定义函数,去实现⼀个⽅法,利⽤⾝份证号去判断性别(18位⾝份证的倒数第⼆位偶数为⼥,奇数为男.15位⾝份证的倒数第⼀位偶数为⼥,奇数为男.).其实这个需求可以使⽤hive⾃带的function去进⾏解决.我们接下来使⽤2种⽅式去实现这个需求.
数据准备
我们在hive上创建⼀个external表(名字person表),执⾏如下代码:
create external table person(
name string,
idcard string)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY'\t'
STORED as TEXTFILE;
该表两个字段,⼀个为name,另⼀个为idcard
数据格式如下:
neil 411326************
pony 411325************
jcak 12312423454556561
tony 412345671234908
field分隔符使⽤\t
我们将数据放⼊hive的warehouse中:
hdfs dfs -put person.txt /user/hive/warehouse/test_neil.db/person
执⾏select,我们发现数据已经进⼊到hive了.
使⽤Hive Function去实现
我们可以执⾏⼀下的hql去实现
select idcard,
case when length(idcard) =18then
case when substring(idcard,-2,1) %2=1then'男'
when substring(idcard,-2,1) %2=0then'⼥'
else'unknown'end
when length(idcard) =15then
case when substring(idcard,-1,1) %2=1then'男'
when substring(idcard,-1,1) %2=0then'⼥'
else'unknown'end
else'不合法'end
from person;
得到的结果如下(beeline下):
+---------------------+------+--+
| idcard | _c1 |
+---------------------+------+--+
|12312423454556561|不合法|
|123124234545565|男|
|411325************|男|
| 411325************ |⼥|
UDF编写
如下是我们的udf代码:
# -*- 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,"⾝份信息不合法!"]))
这⾥我们使⽤python的重定向,将hive控制台的输出进⾏split,split默认使⽤的为\t.然后根据split后的idcard的倒数第⼆位进⾏判断这个⼈的性别.
测试
我们在hive中去执⾏查询时,报错的提⽰不是很详细.我们可以使⽤cat指令去测试python脚本的执⾏效果.
我们在终端中执⾏如下指令:
cat person.txt|python person.py
输⼊结果如下:
neil 411325************ 男
pony 411325************ ⼥
jack 12312423454556561 ⾝份信息不合法!
tony 123124234545565 男
说明我们的解析是成功的.
使⽤
我们在hive中使⽤python定义的UDF函数要借助transform函数去执⾏.
transform函数的语法如下:
SELECT TRANSFORM (<columns>)
USING 'python <python_script>'
AS (<columns>)
FROM <table>;
transfrom和as的columns的个数不必⼀致.
我们⾸先需要将我们的person.py加载⼊
我们在hive中去执⾏如下代码:
add file /xxx/person.py
xxx为本地⽂件的路径.
然后使⽤transform函数执⾏:
select transform(name,idcard) USING 'python person.py' AS (name,idcard,gender) from person;
java版本也需要打成jar包,使⽤add⽅式添加到hive中
add jar jar_path;
并且要创建函数:
create function fun_name as'java class name' USING jar 'hdfs_jar_path';
//上⽅为官⽅⽂档案例,下⾯的是我⾃⼰写的,属于临时函数,重启hive后失效create function fun_name as'java class name';
查询:
select fun_name(字段...) from table_name;
我们同样可以得到如下的结果:
neil 411325************男
pony 411325************ ⼥
jack 12312423454556561⾝份信息不合法!
tony 123124234545565男。