Hive|Spark 函数详解
- 基本比较运算函数
- =、==
- !
- !=、<>
- <=>
- <、<=
- >、>=
- 特殊比较运算函数
- BETWEEN
- IS [NOT] NULL
- IN
- AND
- ANY
- assert_true
- bool_and
- 基本数学运算函数
- +
- -
- /
- *
- 类型转换相关函数
- bigint - 转换为 bigint 类型
- binary - 转换为 binary 类型
- bin
- 常用的数学函数
- abs - 绝对值
- acos - 反余弦值
- acosh - 反双曲余弦值
- avg - 求平均值
- 位运算相关的函数
- bit_and - 与
- bit_or - 或
- bit_xor
- bit_count
- bit_get
- bit_length
- 常用的聚合函数
- aggregate - 累加聚合函数
- approx_count_distinct
- 常用的日期函数
- add_months
- 字符串相关函数
- ascii
- base64
- 数组相关函数
- array
- array_contains
- array_distinct
- array_except
- array_intersect
- array_join
- array_max
- array_min
- array_position
- array_remove
- array_repeat
- array_sort
- array_union
- arrays_overlap
- arrays_zip
持续更新…
基本比较运算函数
注意: 在比较比较运算函数中, 对于一些可能存在为 NULL
的情况, 一定要增加逻辑判断和处理
=、==
expr1 = expr2 - 如果 expr1 equals expr2 则返回 true
, 否则返回 false
① 为 NULL
的情况
如果 expr1
或 expr2
任意一个或两个都为 NULL
,则返回结果一定为 NULL
② 类型转换
expr1
和 expr2
必须为相同的类型或者可以转换成公共的的类型, 而且必须是可以在相等比较中使用的类型. Map
类型目前不支持. 对于 array
| struct
等复杂类型,字段的数据类型必须是可以排序的.
-- 比较相同类型,且都不为 NULL
> SELECT 2 = 2;
true
-- 比较不同的类型, 但是可以转换为公共的类型
> SELECT 1 = '1';
true
-- expr1 和 expr2 为 NULL 的情况, 只有有 NULL , 则一定返回 NULL
> SELECT true = NULL;
NULL
> SELECT NULL = NULL;
NULL
试一下 array
类型, 这里需要注意一下
-- 我们创建两个数组(元素相同,但是顺序不同), 然后进行比较,
> SELECT array(1,2,3) = array(3,2,1);
FALSE
-- 我们创建两个数组(元素相同,顺序相同), 然后进行比较,
> SELECT array(1,2,3) = array(3,2,1);
TRUE
!
! expr - 逻辑非
-- 只有这三种情况
> SELECT ! true;
false
> SELECT ! false;
true
> SELECT ! NULL;
NULL
!=、<>
说明:在 SPARK
和 HIVE
中, <>
和 !=
的用法相同
expr1 != expr2 - 如果 expr1 not equals expr2 则返回 true
, 否则返回 false
. 和 =
的情况相反
① 注意数据为 NULL
的情况, 参考 =
② 注意类型转换的情况, 参考 =
> SELECT 1 != 2;
true
> SELECT 1 != '2';
true
> SELECT true != NULL;
NULL
> SELECT NULL != NULL;
NULL
<=>
expr1 <=> expr2 - 在 expr1
和 expr2
都不为 NULL
的情况下, 用法和 =
相同; 如果 expr1
和 expr2
都为 NULL
返回 true
, 如果 expr1
和 expr2
任意一个为 NULL
, 则返回 NULL
① 注意数据为 NULL
的情况, 参考 =
② 注意类型转换的情况, 参考 =
> SELECT 2 <=> 2;
true
> SELECT 1 <=> '1';
true
> SELECT true <=> NULL;
false
> SELECT NULL <=> NULL;
true
<、<=
expr1 < expr2 - 如果 expr1 小于 expr2 则返回 true
, 否则返回 false
expr1 <= expr2 - 如果 expr1 小于等于 expr2 则返回 true
, 否则返回 false
① 注意数据为 NULL
的情况, 参考 =
② 注意类型转换的情况, 参考 =
> SELECT 1 < 2;
true
> SELECT 1.1 < '1';
false
> SELECT to_date('2009-07-30 04:17:52') < to_date('2009-07-30 04:17:52');
false
> SELECT to_date('2009-07-30 04:17:52') < to_date('2009-08-01 04:17:52');
true
> SELECT 1 < NULL;
NULL
> SELECT '1' < 1;
true
>、>=
expr1 > expr2 - 如果 expr1 大于 expr2 则返回 true
, 否则返回 false
expr1 >= expr2 - 如果 expr1 大于等于 expr2 则返回 true
, 否则返回 false
① 注意数据为 NULL
的情况, 参考 =
② 注意类型转换的情况, 参考 =
> SELECT 2 > 1;
true
> SELECT 2 > '1.1';
true
> SELECT to_date('2009-07-30 04:17:52') > to_date('2009-07-30 04:17:52');
false
> SELECT to_date('2009-07-30 04:17:52') > to_date('2009-08-01 04:17:52');
false
> SELECT 1 > NULL;
NULL
特殊比较运算函数
BETWEEN
expr1 [NOT] BETWEEN expr2 AND expr3 - 计算如果 expr1 是否在 expr2 和 expr3 之间的范围内; 使用 NOT
关键字可以实现相反的效果
-- 计算 1, 3, 5, 7 在 2 和 5 之间的元素(该示例为 spark 语法)
> SELECT col1 FROM VALUES 1, 3, 5, 7 WHERE col1 BETWEEN 2 AND 5;
3
5
-- 计算 1, 2, 3, 4 在 2 和 4 之间的元素(spark 和 hive 都支持)
> WITH t AS
(
select 1 as id
UNION ALL
select 2 as id
UNION ALL
select 3 as id
UNION ALL
select 4 as id
)
select id
from t
where id between 2 and 4;
我们试试当数据中存在为 NULL
的情况
WITH t AS
(
select 1 as id
UNION ALL
select 2 as id
UNION ALL
select 3 as id
UNION ALL
select NULL as id
)
select id
from t
where id between 2 and 4;
通过以上示例, 我们可以得知: 当数据为 NULL
时会被排除在 [not] between...and
中的
IS [NOT] NULL
is null(expr) - 当 expr 为 NULL
时返回 true
; 否则,反之
注意:当我们的数据中存在为 NULL
的数据时, 一定要通过这种方式去处理
-- 第一种写法
> SELECT isnull(1);
false
> SELECT isnull(NULL);
-- 第二种写法
> SELECT 1 is null;
false
> SELECT 1 is not null;
false
IN
expr1 in(expr2, expr3, …) - 如果 expr1
在 expr2, expr3, ...
中则返回 true
, 否则返回 false
> SELECT 1 in(1, 2, 3);
true
> SELECT 1 in(2, 3, 4);
false
> SELECT named_struct('a', 1, 'b', 2) in(named_struct('a', 1, 'b', 1), named_struct('a', 1, 'b', 3));
false
> SELECT named_struct('a', 1, 'b', 2) in(named_struct('a', 1, 'b', 2), named_struct('a', 1, 'b', 3));
true
AND
expr1 and expr2 - 逻辑与
> SELECT true and true;
true
> SELECT true and false;
false
> SELECT true and NULL;
NULL
> SELECT false and NULL;
false
ANY
any(expr) - 至少有一个值为 true
则返回 true
注:Spark 3.0 的函数
> SELECT any(col) FROM VALUES (true), (false), (false) AS tab(col);
true
> SELECT any(col) FROM VALUES (NULL), (true), (false) AS tab(col);
true
> SELECT any(col) FROM VALUES (false), (false), (NULL) AS tab(col);
false
assert_true
assert_true(expr) - 如果表达式不为 True
,则抛出一个异常
> SELECT assert_true(0 < 1);
NULL
bool_and
bool_and(expr) - 如果所有的值都为 true
则返回 true
.
> SELECT bool_and(col) FROM VALUES (true), (true), (true) AS tab(col);
true
> SELECT bool_and(col) FROM VALUES (NULL), (true), (true) AS tab(col);
true
> SELECT bool_and(col) FROM VALUES (true), (false), (true) AS tab(col);
false
基本数学运算函数
+
expr1 + expr2 - 返回 expr1 + expr2 的结果
-- 数值类型的加法操作
> SELECT 1 + 2;
3
我们试一下如果是字符串类型的数字相加的效果
> select '1' + '2';
3
该结果说明如果不是数值类型,会先进行类型转换,然后相加。如果无法转换,相加后的结果则为 NULL
-
expr1 - expr2 - 返回 expr1 - expr2 的结果
特殊的地方可以参考 +
> SELECT 2 - 1;
1
/
expr1 / expr2 - 返回 expr1 除以 expr2 的结果
注意:除法操作执行的总是浮点操作
> SELECT 3 / 2;
1.5
> SELECT 2L / 2L;
1.0
*
expr1 * expr2 - 返回 expr1 和 expr2 相乘的结果
注意:会根据数值的类型进行判断,然后执行相应的操作,需要注意服点类型数据的计算
> SELECT 2 * 3;
6
-- 浮点数据计算需要注意
> SELECT 0.2 * 0.4;
0.08000000000000002
> SELECT 0.3 * 0.2;
0.06
类型转换相关函数
bigint - 转换为 bigint 类型
bigint(expr) - 转换 expr
的值为 bigint
类型
> SELECT bigint(1);
1
binary - 转换为 binary 类型
binary(expr) - 将 expr 的值转换为 binary 类型
> SELECT binary('abc');
abc
bin
bin(expr) - 返回以二进制表示的长值 expr 的字符串表示形式
> SELECT bin(13);
1101
> SELECT bin(-13);
1111111111111111111111111111111111111111111111111111111111110011
> SELECT bin(13.3);
1101
常用的数学函数
abs - 绝对值
abs(expr) - 返回数值的绝对值
> SELECT abs(-1);
1
-- 会对字符串类型转换
> select abs('-23');
23.0
acos - 反余弦值
acos(x) - 如果 -1<=x<=1
得到的是 x 的余弦值,如果是其他的值返回的是 NaN
> SELECT acos(1);
0.0
> SELECT acos(2);
NaN
acosh - 反双曲余弦值
acosh(expr) - 返回 expr 的反双曲余弦值
> SELECT acosh(1);
0.0
> SELECT acosh(0);
NaN
avg - 求平均值
avg(expr) - 计算一组数据的平均值
> SELECT avg(col) FROM VALUES (1), (2), (3) AS tab(col);
2.0
> SELECT avg(col) FROM VALUES (1), (2), (NULL) AS tab(col);
1.5
位运算相关的函数
bit_and - 与
bit_and(expr) - 返回所有非空输入值的按位与,如果没有则返回空
> SELECT bit_and(col) FROM VALUES (3), (5) AS tab(col);
1
bit_or - 或
bit_or(expr) - 返回所有非空输入值的按位或,如果没有则返回空
> SELECT bit_or(col) FROM VALUES (3), (5) AS tab(col);
7
bit_xor
bit_xor(expr) - 返回所有非空输入值的按位异或,如果没有则返回空
> SELECT bit_xor(col) FROM VALUES (3), (5) AS tab(col);
6
bit_count
bit_and(expr) - 返回在参数 expr 中设置为无符号 64 位整数的位数,如果参数为 NULL,则返回 NULL
> SELECT bit_count(0);
0
bit_get
bit_get(expr, pos) - 返回指定位置的位(0 或 1)的值。 位置从右到左编号,从零开始。 位置参数不能为负
> SELECT bit_get(11, 0);
1
> SELECT bit_get(11, 2);
0
bit_length
bit_length(expr) - 返回字符串数据的位长或二进制数据的位数
> SELECT bit_length('Spark SQL');
72
常用的聚合函数
aggregate - 累加聚合函数
aggregate(expr, start, merge, finish) - 设定一个初始值,并将数组中的所有值和初始值累加聚合
-- 设定初始值为 0 ,然后将初始值和数组中的值进行累加
> SELECT aggregate(array(1, 2, 3), 0, (acc, x) -> acc + x);
6
> SELECT aggregate(array(1, 2, 3), 1, (acc, x) -> acc + x);
7
-- 设定初始值为 0 ,然后将初始值和数组中的值进行累加,最后将结果乘10
> SELECT aggregate(array(1, 2, 3), 0, (acc, x) -> acc + x, acc -> acc * 10);
60
approx_count_distinct
approx_count_distinct(expr[, relativeSD]) - 通过 HyperLogLog++ 返回估计的去重后的值的行数,效率比 group + count
快很多。 relativeSD
定义允许的最大相对标准偏差
> SELECT approx_count_distinct(col1) FROM VALUES (1), (1), (2), (2), (3) tab(col1);
3
常用的日期函数
add_months
add_months(start_date, num_months) - 返回指定日期增加指定数值的月后的日期,start_date
的日期格式必须符合 yyyy-MM-dd
格式,否则返回 NULL
> SELECT add_months('2016-08-31', 1);
2016-09-30
字符串相关函数
ascii
ascii(str) - 返回字符串中第一个字符的 ASCII 码位,如果第一个字符不是 ASCII 字符或不属于 UTF-16 的 Latin-1 补充范围,则结果为未定义。
> SELECT ascii('222');
50
> SELECT ascii(2);
50
base64
base64(bin) - 把字符串转换为一个 base64
的字符串
> SELECT base64('Spark SQL');
U3BhcmsgU1FM
数组相关函数
array
array(expr, …) - 生成一个数组
注意:如果包含字符串,则返回的数组是字符串类型
> SELECT array(1, 2, 3);
[1,2,3]
> SELECT array(1, 2, 'a');
["1","2","a"]
array_contains
array_contains(array, value) - 如果数组包含指定的值则返回 true
,否则返回 false
> SELECT array_contains(array(1, 2, 3), 2);
true
array_distinct
array_distinct(array) - 数组去重
> SELECT array_distinct(array(1, 2, 3, null, 3));
[1,2,3,null]
array_except
array_except(array1, array2) - 返回在 array1 但是不在 array2 的元素
> SELECT array_except(array(1, 2, 3), array(1, 3, 5));
[2]
array_intersect
array_intersect(array1, array2) - 取交集
> SELECT array_intersect(array(1, 2, 3), array(1, 3, 5));
[1,3]
array_join
array_join(array, delimiter[, nullReplacement]) - 将数组中的元素通过指定的连接符拼接起来
注意:如果没有设置为 NULL
时的替代值,NULL
值会被过滤
> SELECT array_join(array('hello', 'world'), ' ');
hello world
> SELECT array_join(array('hello', null ,'world'), ' ');
hello world
-- 设置空格为分隔符,如果存在 null 值,则使用 ',' 号替换
> SELECT array_join(array('hello', null ,'world'), ' ', ',');
hello , world
array_max
array_max(array) - 返回数组中最大的值. 对于 double/float 类型,NaN 大于任何非 NaN 元素。 NULL 元素被跳过。
> SELECT array_max(array(1, 20, null, 3));
20
array_min
array_min(array) - 返回数组中最小的值. 对于 double/float 类型,NaN 大于任何非 NaN 元素。 NULL 元素被跳过。
> SELECT array_min(array(1, 20, null, 3));
1
array_position
array_position(array, element) - 返回指定元素在数组中第一次出现的下标记, long类型
注意:和 JAVA 中的数组不同,返回的实际下标会 +1
> SELECT array_position(array(3, 2, 1), 1);
3
array_remove
array_remove(array, element) - 移除指定数组中指定的元素
> SELECT array_remove(array(1, 2, 3, null, 3), 3);
[1,2,null]
array_repeat
array_repeat(element, count) - 返回包含元素计数次数的数组
> SELECT array_repeat('123', 2);
["123","123"]
array_sort
array_sort(expr, func) - 对数组排序并返回排序后的数组
可以自定义排序的函数
> SELECT array_sort(array(5, 6, 1), (left, right) -> case when left < right then -1 when left > right then 1 else 0 end);
[1,5,6]
> SELECT array_sort(array('bc', 'ab', 'dc'), (left, right) -> case when left is null and right is null then 0 when left is null then -1 when right is null then 1 when left < right then 1 when left > right then -1 else 0 end);
["dc","bc","ab"]
> SELECT array_sort(array('b', 'd', null, 'c', 'a'));
["a","b","c","d",null]
array_union
array_union(array1, array2) - 返回两个数组合并后的结果,相同的元素会被排除
> SELECT array_union(array(1, 2, 3), array(1, 3, 5));
[1,2,3,5]
arrays_overlap
arrays_overlap(a1, a2) - 如果两个数组有相同元素,则返回true,否则返回false
如果相同的元素只有 NULL,则返回 NULL
> SELECT arrays_overlap(array(1, 2, 3), array(3, 4, 5));
true
arrays_zip
arrays_zip(a1, a2, …) - 返回多个数组合并后的结构化数据,感觉这个的实际应用场景很少,可能刚开始看不懂。
> SELECT arrays_zip(array(1, 2, 3), array(2, 3, 4));
[{"0":1,"1":2},{"0":2,"1":3},{"0":3,"1":4}]
> SELECT arrays_zip(array(1, 2), array(2, 3), array(3, 4));
[{"0":1,"1":2,"2":3},{"0":2,"1":3,"2":4}]