使用Python编写Hive UDF
Posted 多鱼的夏天
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Python编写Hive UDF相关的知识,希望对你有一定的参考价值。
Hive 内置为我们提供了大量的常用函数用于日常的分析,但是总有些情况这些函数还是无法满足我们的需求。
值得高兴的是,Hive 允许用户自定义一些函数,用于扩展 HiveQL 的功能,这类函数叫做 UDF(用户自定义函数)。
使用 Java 编写 UDF 是最常见的方法,但是本文介绍的是如何使用 Python 来编写 Hive 的 UDF 函数。
假设我们有个名为 data.txt 的文件,格式如下:
Sophie Russell
Neil McGrath
Jack Glover
Gordon Mackenzie
Megan Russell
这个问卷放到/tmp 目录
上面文件的内容每一行代表一个人的名字,现在我们需要使用 Hive 分别获取到每个人的 First name 和 Last name。我们 Hive 表的建表语句如下:
CREATE TABLE `people`(
`fname` string,
`lname` string
)
我们现在将上面的数据导入到这个表中:
load data local inpath '/tmp/data.txt' into table mytable;
我们直接 select 出来的数据如下:
hive > select * from people;
OK
Sophie Russell NULL
Neil McGrath NULL
Jack Glover NULL
Gordon Mackenzie NULL
Megan Russell NULL
Time taken: 0.297 seconds, Fetched: 5 row(s)
这不是我们要的数据,因为每一行的数据全部解析到 fname 字段,而 lname 字段并没有值,所以最后一列为 NULL。现在我们编写一个 Python 脚本来处理这个问题:
vi /tmp/name.py
#!/usr/bin/python
import sys
for line in sys.stdin:
line = line.strip()
fname , lname = line.split(' ')
l_name = lname.lower()
print('\\t'.join([fname, str(l_name)]))
上面的脚本意思是将每行的数据按照空格分割,然后分别赋值给 fname 和 lname。
下面我们到 Hive 中使用 Python 编写好的 UDF,语法如下:
SELECT TRANSFORM(stuff)
USING 'script'
AS thing1, thing2
or
SELECT TRANSFORM(stuff)
USING 'script'
AS (thing1 INT, thing2 INT)
通过 Python 解析好的数据全部都是 String 类型的,如果你需要转换成其他类型,可以使用第二个语法。所有我们的例子里面可以如下使用:
hive> add FILE /tmp/name.py;
Added resources: [/tmp/name.py]
hive> select TRANSFORM (fname) USING "python name.py" as (fname,lname) from people;
Query ID = hadoop01_20210610183247_28bb394d-8d94-498e-9a58-5a4ef5d1b6c9
Total jobs = 1
Launching Job 1 out of 1
Number of reduce tasks is set to 0 since there's no reduce operator
Starting Job = job_1622964588806_0014, Tracking URL = http://zk01:8088/proxy/application_1622964588806_0014/
Kill Command = /data01/hadoop-3.2.2/bin/mapred job -kill job_1622964588806_0014
Hadoop job information for Stage-1: number of mappers: 1; number of reducers: 0
2021-06-10 18:33:33,634 Stage-1 map = 0%, reduce = 0%
2021-06-10 18:33:57,115 Stage-1 map = 100%, reduce = 0%, Cumulative CPU 3.76 sec
MapReduce Total cumulative CPU time: 3 seconds 760 msec
Ended Job = job_1622964588806_0014
MapReduce Jobs Launched:
Stage-Stage-1: Map: 1 Cumulative CPU: 3.76 sec HDFS Read: 4673 HDFS Write: 207 SUCCESS
Total MapReduce CPU Time Spent: 3 seconds 760 msec
OK
Sophie Russell
Neil McGrath
Jack Glover
Gordon Mackenzie
Megan Russell
Time taken: 71.07 seconds, Fetched: 5 row(s)
正如上面的结果,我们已经获取到需要的结果
以上是关于使用Python编写Hive UDF的主要内容,如果未能解决你的问题,请参考以下文章