Hive的内置操作符与很多编程语言中的操作符相似,可以分为关系操作符、算术操作符、逻辑操作符和复合类型操作符,下面进行一一学习。
关系操作符
关系操作符比较操作数并产生TRUE或者FALSE,需要注意的是Hive的相等比较为=,而不是= =。
操作符 | 类型 | 描述 |
A = B | 数值类型 | 如果A与B相等则返回TRUE,否则返回FALSE |
A <=> B | 数值类型 | 对于非NULL操作数,结果与=相同,如果都是NULL则返回TRUE,如果其中之一是NULL,返回FALSE |
A <> B | 数值类型 | 若A或B为NULL,返回NULL。若A与B不相等,返回TRUE,否则为FALSE |
A != B | 数值类型 | 同<> 操作符 |
A < B | 数值类型 | 若A或B为NULL,返回NULL。A小于B返回TRUE,否则返回FALSE |
A <= B | 数值类型 | 若A或B为NULL,返回NULL。A小于等于B返回TRUE,否则返回FALSE |
A > B | 数值类型 | 若A或B为NULL,返回NULL。A大于B返回TRUE,否则返回FALSE |
A >= B | 数值类型 | 若A或B为NULL,返回NULL。A大于等于B返回TRUE,否则返回FALSE |
A [NOT] BETWEEN B AND C | 数值类型 | 若A或B,或C为NULL,返回NULL。如果A大于等于B且小于等于C,返回TRUE,否则为FALSE |
A IS NULL | 数值类型 | 若A为NULL,返回TRUE,否则为FALSE |
A IS NOT NULL | 数值类型 | 若A为NULL,返回FALSE,否则为TRUE |
A [NOT] LIKE B | 字符串 | 若A或B为NULL,返回NULL。若字符串A匹配SQL正则表达式B,返回TRUE,否则FALSE。B中的_字符匹配A中的任何字符,%字符匹配A中任意数量的字符,例如'foobar' like 'foo' 得到FALSE, 'foobar' like 'foo_ _ _'得到TRUE,'foobar' like 'foo%'也为TRUE |
A RLIKE B | 字符串 | 若A或B为NULL,返回NULL。如果A中的任何子串(可能是空字串)匹配Java正则表达式B,返回TRUE,否则为FALSE。例如 'foobar' RLIKE 'foo' 结果为TRUE, 'foobar' RLIKE '^f.*r$'也为TRUE。 |
A REGEXP B | 字符串 | 同RLIKE |
算术操作符
下表中的操作符支持各种常用的算术操作,返回值都为数值类型,如果任意的操作数为NULL,结果也为NULL。
操作符 | 类型 | 描述 |
A + B | 数值类型 | 返回A加B的结果。结果类型为两个操作数中最高层级的类型,比如一个操作数为int,另一个为float,则结果类型为float。 |
A - B | 数值类型 | 返回A减B的结果。 |
A * B | 数值类型 | 返回A乘B的结果。如果相乘引起溢出,必须将低层级的类型转换为高层级的类型。 |
A / B | 数值类型 | 返回A除以B的结果,结果类型为double。 |
A % B | 数值类型 | 返回A除以B的余数,结果类型为两个操作数中最高层级的类型。 |
A & B | 数值类型 | 返回A和B按位与的结果,结果类型为两个操作数中最高层级的类。 |
A | B | 数值类型 | 返回A和B按位或的结果,结果类型为两个操作数中最高层级的类。 |
A ^ B | 数值类型 | 返回A和B按位异或的结果,结果类型为两个操作数中最高层级的类。 |
~A | 数值类型 | 返回A按位非的结果,结果类型与A一致。 |
逻辑操作符
下表中的操作符用于逻辑表达式,返回值为TRUE,FALSE或NULL。
操作符 | 类型 | 描述 | |
A AND B | boolean | 若A与B都为true,结果为true,否则false,若A或B为NULL,结果为NULL。 |
|
A && B | boolean | 同A AND B。 |
|
A OR B | boolean | 若A或B或两者都为true,结果为true。FALSE OR NULL 结果为false,否则为false(A与B都为false)。 |
|
A || B | boolean | 同A OR B。 |
|
NOT A | boolean | 若A为false,结果为true,若A为NULL,结果为NULL,否则为false。 |
|
! A | boolean | 同 NOT A。 |
|
A IN (val1, val2, ...) | boolean | 若A与任意值相等则返回true。 |
|
A NOT IN (val1, val2, ...) | boolean | 若A与任何值都不相等则返回true。 |
|
[NOT] EXISTS (subquery) | boolean | 若子查询返回至少一行数据则返回true。 |
|
复合类型操作符
在学习用于复合类型的操作符之前,先学习一下复合类型的构造方法。
构造方法 | 操作数 | 描述 |
map | (key1, value1, key2, value2, ...) | 使用key/value对创建map。 |
struct | (val1, val2, val3, ...) | 使用给定的字段值创建struct,字段名称为 col1, col2, ...。 |
named_struct | (name1, val1, name2, val2, ...) | 使用给定的字段名称和值创建struct。 |
array | (val1, val2, ...) | 使用给定的值创建数组。 |
create_union | (tag, val1, val2, ...) | 使用tag指向的值创建union类型。 |
用于复合类型的操作数如下所示:
操作符 | 操作数类型 | 描述 |
A[n] | A 是数组,n的类型为int | 返回A中的第n个元素,第一个元素的索引为0。 |
M[key] | M是个map | 返回M中key对应的值。 |
S.x | S是struct | 返回S的x字段。例如,对于struct foobar {int foo, int bar}, foobar.foo 返回存在于foo字段的整数值。 |