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, |