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 的情况

如果 expr1expr2 任意一个或两个都为 NULL ,则返回结果一定为 NULL

② 类型转换

expr1expr2 必须为相同的类型或者可以转换成公共的的类型, 而且必须是可以在相等比较中使用的类型. 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

spark reduce函数 spark函数教程_数组

-- 我们创建两个数组(元素相同,顺序相同), 然后进行比较,
> SELECT array(1,2,3) = array(3,2,1);
 TRUE

spark reduce函数 spark函数教程_类型转换_02

!

! expr - 逻辑非

-- 只有这三种情况
> SELECT ! true;
 false
> SELECT ! false;
 true
> SELECT ! NULL;
 NULL

!=、<>

说明:在 SPARKHIVE 中, <>!= 的用法相同

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

spark reduce函数 spark函数教程_hive_03

<=>

expr1 <=> expr2 - 在 expr1expr2 都不为 NULL 的情况下, 用法和 = 相同; 如果 expr1expr2 都为 NULL 返回 true , 如果 expr1expr2 任意一个为 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;

spark reduce函数 spark函数教程_类型转换_04


我们试试当数据中存在为 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;

spark reduce函数 spark函数教程_字符串_05


通过以上示例, 我们可以得知: 当数据为 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, …) - 如果 expr1expr2, 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

spark reduce函数 spark函数教程_spark_06

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

spark reduce函数 spark函数教程_hive_07


该结果说明如果不是数值类型,会先进行类型转换,然后相加。如果无法转换,相加后的结果则为 NULL

spark reduce函数 spark函数教程_类型转换_08

-

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}]

spark reduce函数 spark函数教程_数组_09