整套大数据学习资料(视频+笔记)百度网盘无门槛下载:http://www.edu360.cn/news/content?id=3377

​ 12.8 用户定义函数

hadoop 小红牛 7℃ 0评论

你要写的査询有时无法轻松(或根本不能)使用Hive提供的内置函数来表 示。通过写“用户定义函数”(user-defined function, UDF), Hive可以方便 地插入用户写的处理代码并在査询中调用它们。

UDF必须用Java语言编写。Hive本身也是用Java写的。对于其他编程语 言,可以考虑使用SELECT TRANSFORM査询,有了它,可以让数据流式 通过用户定义脚本(参见12.7.2节)。

Hive中有三种UDF:(普通)UDF、用户定义聚集函数(user-defined
aggregate function , UDAF)以及用户定义表生成函数(user-defined table-generating
function, UDTF)。它们所接受的输入和产生的输出的数据行的数量是不 同的。

•UDF操作作用于单个数据行,巨产生一个数据行作为输出。大多 数函数(例如数学函数和字符串函数)都属于这一类。

•UDAF接受多个输入数据行,并产生一个输出数据行。像COUNT 和MAX这样的函数都是聚集函数。

• UDTF操作作用于单个数据行,且产生多个数据行 —一个表—作为输出。

和其他两种类型相比,表生成函数的知名度较低。所以让我们来看一个示 例。考虑这样一个表,它只有一列X,包含的是字符串数组。回头看看表的 定义和填充方式是很有启发的:

CREATE TABLE arrays (x ARRAY<STRING>) ROW
FORMAT DELIMITED
FIELDS TERMINATED BY '\001'
COLLECTION ITEMS TERMINATED BY ‘\002';

注意,ROW FORMAT子句指定数组中的项用Control-B字符分隔。我们要加载的示例文件内容如下,为了显示方便,用AB表示Control-B字符:

a^Bb
c^Bd^Be

在运行LOAD DATA命令以后,下面的査询可以确认数据已正确加载:

hive> SELECT * FROM arrays;
["a","b"]
["c","d","e"]

接下来我们可以使用explode UDTF对表进行变换。这个函数为数组中 的每一项输出一行。因此,在这里,输出的列y的数据类型为STRING。其 结果是,表被“平面化”(flattened)成五行:

hive> SELECT explode(x) AS y FROM arrays;
a


d  
e

带UDTF的SELECT语句在使用时有一些限制(例如,它们不能检索额外的列表达式),使实际使用时这些语句的用处并不大。为此,Hive支持 LATERAL VIEW査询。这一语句的功能更强大。这里不介绍LATERAL VIEW 査询。

转载请注明:全栈大数据 » ​ 12.8 用户定义函数

喜欢 (0)or分享 (0)
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址