前言
本文隶属于专栏《1000个问题搞定大数据技术体系》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!
本专栏目录结构和参考文献请见1000个问题搞定大数据技术体系
目录
Spark SQL 内置函数(一)Array Functions(基于 Spark 3.2.0)
Spark SQL 内置函数(二)Map Functions(基于 Spark 3.2.0)
Spark SQL 内置函数(三)Date and Timestamp Functions(基于 Spark 3.2.0)
Spark SQL 内置函数(四)JSON Functions(基于 Spark 3.2.0)
Spark SQL 内置函数(五)Aggregate Functions(基于 Spark 3.2.0)
Spark SQL 内置函数(六)Window Functions(基于 Spark 3.2.0)
正文
array(expr, …)
描述
返回给定元素组成的数组。
实践
SELECT array(1, 2, 3);
+--------------+
|array(1, 2, 3)|
+--------------+
| [1, 2, 3]|
+--------------+
array_contains(array, value)
描述
如果数组array
包含指定值value
,则返回true
。
实践
SELECT array_contains(array(1, 2, 3), 2);
+---------------------------------+
|array_contains(array(1, 2, 3), 2)|
+---------------------------------+
| true|
+---------------------------------+
array_distinct(array)
描述
从数组array
中去除重复的值。
实践
SELECT array_distinct(array(1, 2, 3, null, 3));
+---------------------------------------+
|array_distinct(array(1, 2, 3, NULL, 3))|
+---------------------------------------+
| [1, 2, 3, null]|
+---------------------------------------+
array_except(array1, array2)
描述
- 返回的数组中包含
array1
中的元素,但不包含array2
中的元素。 - 没有重复元素。
实践
SELECT array_except(array(1, 2, 3), array(1, 3, 5));
+--------------------------------------------+
|array_except(array(1, 2, 3), array(1, 3, 5))|
+--------------------------------------------+
| [2]|
+--------------------------------------------+
array_intersect(array1, array2)
描述
- 返回
array1
和array2
的元素交集组成的数组。 - 没有重复元素。
实践
SELECT array_intersect(array(1, 2, 3), array(1, 3, 5));
+-----------------------------------------------+
|array_intersect(array(1, 2, 3), array(1, 3, 5))|
+-----------------------------------------------+
| [1, 3]|
+-----------------------------------------------+
array_join(array, delimiter[, nullReplacement])
描述
- 用指定的分隔符以及一个可选的用来取代null值的字符串,将数组
array
中所有元素串联起来。 - 如果
nullReplacement
未设值,则过滤掉所有的null
值。
实践
SELECT array_join(array('hello', 'world'), ' ');
+----------------------------------+
|array_join(array(hello, world), )|
+----------------------------------+
| hello world|
+----------------------------------+
SELECT array_join(array('hello', null ,'world'), ' ');
+----------------------------------------+
|array_join(array(hello, NULL, world), )|
+----------------------------------------+
| hello world|
+----------------------------------------+
SELECT array_join(array('hello', null ,'world'), ' ', ',');
+-------------------------------------------+
|array_join(array(hello, NULL, world), , ,)|
+-------------------------------------------+
| hello , world|
+-------------------------------------------+
array_max(array)
描述
- 返回数组
array
中的最大值。 - 对于
double/float
类型,NaN
大于任何非NaN
元素。 null
值会被跳过。
实践
SELECT array_max(array(1, 20, null, 3));
+--------------------------------+
|array_max(array(1, 20, NULL, 3))|
+--------------------------------+
| 20|
+--------------------------------+
array_min(array)
描述
- 返回数组
array
中的最小值。 - 对于
double/float
类型,NaN
大于任何非NaN
元素。 null
值会被跳过。
实践
SELECT array_min(array(1, 20, null, 3));
+--------------------------------+
|array_min(array(1, 20, NULL, 3))|
+--------------------------------+
| 1|
+--------------------------------+
array_position(array, element)
描述
- 返回
array
中的第一个出现element
的数组索引。 - 数组索引从
1
开始。 - 返回值为
long
类型。
实践
SELECT array_position(array(3, 2, 1), 1);
+---------------------------------+
|array_position(array(3, 2, 1), 1)|
+---------------------------------+
| 3|
+---------------------------------+
array_remove(array, element)
描述
从 array
中移除等于 element
的所有元素。
实践
SELECT array_remove(array(1, 2, 3, null, 3), 3);
+----------------------------------------+
|array_remove(array(1, 2, 3, NULL, 3), 3)|
+----------------------------------------+
| [1, 2, null]|
+----------------------------------------+
array_repeat(element, count)
描述
返回元素 element
重复 count
次 的数组。
实践
SELECT array_repeat('123', 2);
+--------------------+
|array_repeat(123, 2)|
+--------------------+
| [123, 123]|
+--------------------+
array_union(array1, array2)
描述
- 返回
array1
和array2
union
之后的数组。 - 没有重复元素。
实践
SELECT array_union(array(1, 2, 3), array(1, 3, 5));
+-------------------------------------------+
|array_union(array(1, 2, 3), array(1, 3, 5))|
+-------------------------------------------+
| [1, 2, 3, 5]|
+-------------------------------------------+
arrays_overlap(a1, a2)
描述
- 如果
a1
中至少存在一个非空元素 也 存在于a2
中(即a1
和a2
有非空元素重叠),则返回true
。 - 如果没有重叠的元素,
a1
和a2
都是非空的,并且a1
或者a2
包含一个null
值,那么返回null
,否则就返回false
。
实践
SELECT arrays_overlap(array(1, 2, 3), array(3, 4, 5));
+----------------------------------------------+
|arrays_overlap(array(1, 2, 3), array(3, 4, 5))|
+----------------------------------------------+
| true|
+----------------------------------------------+
SELECT arrays_overlap(array(1, 2, 3), array(4, 5, null));
+----------------------------------------------+
|arrays_overlap(array(1, 2, 3), array(3, 4, 5))|
+----------------------------------------------+
| NULL|
+----------------------------------------------+
SELECT arrays_overlap(array(1, 2, 3), array(4, 5));
+----------------------------------------------+
|arrays_overlap(array(1, 2, 3), array(3, 4, 5))|
+----------------------------------------------+
| false|
+----------------------------------------------+
arrays_zip(a1, a2, …)
描述
- 返回多个结构体合并后的新数组。
- 下标为
N
的结构包含下标为N
的所有值。
实践
SELECT arrays_zip(array(1, 2, 3), array(2, 3, 4));
+------------------------------------------+
|arrays_zip(array(1, 2, 3), array(2, 3, 4))|
+------------------------------------------+
| [{1, 2}, {2, 3}, ...|
+------------------------------------------+
SELECT arrays_zip(array(1, 2), array(2, 3), array(3, 4));
+-------------------------------------------------+
|arrays_zip(array(1, 2), array(2, 3), array(3, 4))|
+-------------------------------------------------+
| [{1, 2, 3}, {2, 3...|
+-------------------------------------------------+
flatten(arrayOfArrays)
描述
将一个二维数组转化成一个一维数组。
实践
SELECT flatten(array(array(1, 2), array(3, 4)));
+----------------------------------------+
|flatten(array(array(1, 2), array(3, 4)))|
+----------------------------------------+
| [1, 2, 3, 4]|
+----------------------------------------+
sequence(start, stop, step)
描述
- 从
start
到stop
生成一系列元素,逐步递增。闭区间[start, stop]
- 返回元素的类型与参数表达式的类型相同。
- 支持的类型有:
byte
、short
、int
、long
、date
、timestamp
。 start
和stop
表达式必须解析为同一类型。- 如果
start
和stop
表达式解析为date
或timestamp
类型,则step
表达式必须解析为interval
或year-month interval
或day-time interval
类型,否则解析为与start
和stop
表达式相同的类型。
实践
SELECT sequence(1, 5);
+---------------+
| sequence(1, 5)|
+---------------+
|[1, 2, 3, 4, 5]|
+---------------+
SELECT sequence(5, 1);
+---------------+
| sequence(5, 1)|
+---------------+
|[5, 4, 3, 2, 1]|
+---------------+
SELECT sequence(to_date('2018-01-01'), to_date('2018-03-01'), interval 1 month);
+----------------------------------------------------------------------+
|sequence(to_date(2018-01-01), to_date(2018-03-01), INTERVAL '1' MONTH)|
+----------------------------------------------------------------------+
| [2018-01-01,2018-02-01,2018-03-01]|
+----------------------------------------------------------------------+
SELECT sequence(to_date('2018-01-01'), to_date('2018-03-01'), interval '0-1' year to month);
+--------------------------------------------------------------------------------+
|sequence(to_date(2018-01-01), to_date(2018-03-01), INTERVAL '0-1' YEAR TO MONTH)|
+--------------------------------------------------------------------------------+
| [2018-01-01,2018-02-01,2018-03-01]|
+--------------------------------------------------------------------------------+
shuffle(array)
描述
返回数组中元素随机排列后的新数组。
实践
SELECT shuffle(array(1, 20, 3, 5));
+---------------------------+
|shuffle(array(1, 20, 3, 5))|
+---------------------------+
| [20, 3, 5, 1]|
+---------------------------+
SELECT shuffle(array(1, 20, null, 3));
+------------------------------+
|shuffle(array(1, 20, NULL, 3))|
+------------------------------+
| [3, 20, null, 1]|
+------------------------------+
slice(x, start, length)
描述
- 返回
x
的子集数组 - 从索引
start
开始,长度为length
- 索引下标从
1
开始,如果下标为负数,则代表从末端开始,即 -1 代表数组的最后一个元素。
实践
SELECT slice(array(1, 2, 3, 4), 2, 2);
+------------------------------+
|slice(array(1, 2, 3, 4), 2, 2)|
+------------------------------+
| [2, 3]|
+------------------------------+
SELECT slice(array(1, 2, 3, 4), -2, 2);
+-------------------------------+
|slice(array(1, 2, 3, 4), -2, 2)|
+-------------------------------+
| [3, 4]|
+-------------------------------+
sort_array(array[, ascendingOrder])
描述
- 根据数组元素的自然顺序,按升序或降序对输入数组进行排序。
- 对于
double/float
类型,NaN
大于任何非NaN
元素。 null
元素将按升序放置在返回数组的开头,或按降序放置在返回数组的末尾。
实践
SELECT sort_array(array('b', 'd', null, 'c', 'a'), true);
+-----------------------------------------+
|sort_array(array(b, d, NULL, c, a), true)|
+-----------------------------------------+
| [null, a, b, c, d]|
+-----------------------------------------+