本文是一个系列,第一篇打不开了,所以先翻第二篇。
在第一篇讨论了原始类型和嵌入式数据结构,但UDF限制于只有单条输出。
在本篇文章中,我们将关注UDTF,这个函数类型更加复杂,但是支持单个输入输出多行和多列的信息!(继承自org.apache.hadoop.hive.ql.udf.generic.GenericUDTF)
code
本篇文章中所有的代码和数据放在这里:
https://github.com/rathboma/hive-extension-examples
https://github.com/rathboma/hive-extension-examples
事例数据
将用到的表单命名为:people,它只有一行数据:name,每行数据中包含个人或者夫妇的名字。
它存放于文件:people.txt:
~$cat ./people.txt
John Smith
John and Ann White
Ted Green
Dorothy
我们可以将其放到Hadoop上:
hadoop fs -mkdir people
hadoop fs -put ./people.txt people
然后打开hive,创建hive表单
CREATE EXTERNAL TABLE people (name string)
ROW FORMAT DELIMITED FIELDS
TERMINATED BY '\t'
ESCAPED BY ''
LINES TERMINATED BY '\n'
STORED AS TEXTFILE
LOCATION '/user/matthew/people';
UDTF的返回值
上篇所讨论的UDF和GenericUDF方法对单行数据进行操作,它们仅返回一个元素,且必须返回一个值。
这样并不能适用于所有的数据处理任务。由于Hive可以存储多种数据,有时我们并不想一个输入数据只有一行输出,也许我们希望对于每行输入能够有多行输出。例如,想想方法explode(一个 Hive 内部函数) 所能做的事。
相同的,也许我们也希望能够输出多行数据,而不是简单的返回一个值。
这些事我们都可以通过UDTF做到.
一个实际的例子
让我们假设要去创建一个表用于清洗 people的名字,
新的表单将有:
1.若干行的名字和姓(英文名的first name,Surname)。
2.不记录那些没有同时存在姓和名字的数据(有的可能由于没有空格分开,导致姓名和在一起)
3.有的是夫妇的名字,需要分开。
为了达到上述要求,我们将继承接口:
org.apache.hadoop.hive