Hive提供了大多数操作符,例如用于测试相等性的x='a',用于判空的x IS NULL,用于字符串匹配的x LIKE 'a%',数学运算x+1,逻辑判断x OR y,||是或判断而不是连接字符串,字符串的连接通过concat函数来完成。
Hive内置了非常多的函数。大致可以分为:
- 数学和统计函数
- 字符串函数
- 日期函数
- 条件函数
- 聚合函数
- 操作XML和JSON的函数
在Hive shell,中,可以通过show functions来查看:

desc funtion可以获取简单的 函数帮助文档:

当Hive内置的函数无法满足需要时,可以自定义函数。Hive允许我们在查询中轻易地使用自定义的函数。
UDF必须使用Java语言,如果想要其他语言来实现,可以考虑SELECT TRANSFORM查询,它允许Hive与自定义的脚本通过Steam进行交互,类似MapReduce Streaming和Pig Stream。
Hive中有3中类型的自定义函数:通常的UDF、UDAF(user-defined aggregate function)、UDTF(user-difined table-generating function)。这三种函数的区别在于其输入和输出的行数:
- UDF:一行输入,一行输出
- UDGF:多行输入,一行输出
- UDTF:单行输入,多行输出(table)
UDTF
考虑一个只有一列的表,该列的值为字符串数组:
CREATE TABLE arrays(x ARRAY<STRING>)
ROW FORMAT DELIMITED
FILEDS TERMINATED BY '\001'
COLLECTION ITEMS TERNIMATED BY '\002'
表定义中指定了集合中元素的分隔符为CTRL + B。表中的数据样例如下:
hive> SELECT * FROM arrays;
["a","b"]
["c","b","e"]
接下来我们使用explode UDTF来转换这张表,这个函数将字符数组中的每个元素都转化为一行,有点Flat的意思:
hive> SELECT explode(x) AS y FROM arrays;
a
b
c
d
e
使用UDTF的SELECT查询语句不能再有其他字段的表达式,这是很大的限制。可以使用LATERAL VIEW查询来解决这一问题。比如我们有以下pageAds表数据:
| pageid | adid_list |
|---|---|
| front_page | [1,2,3] |
| contact_page | [3,5,4] |
现在我们想统计每个广告在各个页面上的出现次数。使用lateral view:

本文详细介绍了Hive中的自定义函数,包括UDF(一行输入,一行输出)、UDAF(多行输入,一行输出)和UDTF(单行输入,多行输出)。通过示例展示了如何使用explode UDTF、LATERAL VIEW解决查询限制,以及如何编写和注册自定义函数,如UDF的strip函数和UDAF的求最大值函数。此外,还提到了Hive函数的大小写不敏感特性以及如何持久化和创建临时函数。
最低0.47元/天 解锁文章
1585

被折叠的 条评论
为什么被折叠?



