前言

本文隶属于专栏《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)

描述

  • 返回array1array2 的元素交集组成的数组。
  • 没有重复元素。

实践

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)

描述

  • 返回 array1array2 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 中(即 a1a2 有非空元素重叠),则返回 true
  • 如果没有重叠的元素,a1a2 都是非空的,并且 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)

描述

  • startstop 生成一系列元素,逐步递增。闭区间 [start, stop]
  • 返回元素的类型与参数表达式的类型相同。
  • 支持的类型有:byteshortintlongdatetimestamp
  • startstop 表达式必须解析为同一类型。
  • 如果 startstop 表达式解析为 datetimestamp 类型,则 step 表达式必须解析为 intervalyear-month intervalday-time interval 类型,否则解析为与 startstop 表达式相同的类型。

实践

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]|
+-----------------------------------------+
上一篇 下一篇