前言
本文隶属于专栏《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)
正文
any(expr)
描述
如果至少一个expr
值为真,则返回true。
实践
SELECT any(col) FROM VALUES (true), (false), (false) AS tab(col);
+--------+
|any(col)|
+--------+
| true|
+--------+
SELECT any(col) FROM VALUES (NULL), (true), (false) AS tab(col);
+--------+
|any(col)|
+--------+
| true|
+--------+
SELECT any(col) FROM VALUES (false), (false), (NULL) AS tab(col);
+--------+
|any(col)|
+--------+
| false|
+--------+
approx_count_distinct(expr[, relativeSD])
描述
- 通过
HyperLogLog++
返回估计的基数。 relativeSD
定义了允许的最大相对标准偏差。
实践
SELECT approx_count_distinct(col1) FROM VALUES (1), (1), (2), (2), (3) tab(col1);
+---------------------------+
|approx_count_distinct(col1)|
+---------------------------+
| 3|
+---------------------------+
HyperLogLog++ 是 Google 基于 HyperLogLog 的升级版算法,常用于大数据分析中数据的去重。基数(cardinality)统计,即求一个集合中,不重复的元素个数。
approx_percentile(col, percentage [, accuracy])
描述
- 返回数字列
col
的近似percentile
,这是有序col
值中最小的值(按照从小到大排序),因此小于等于该值不超过col
值的percentage
。 percentage
值必须在0.0到1.0之间。accuracy
参数(默认值:10000)是一个正数字文本,以内存为代价控制近似精度。accuracy
值越高,准确性就越高,1.0/accuracy
是近似值的相对误差。- 当
percentage
是一个数组时,百分比数组的每个值必须在0.0到1.0之间。在这种情况下,返回给定percentage
数组上列col
的近似percentile
数组。
实践
SELECT approx_percentile(col, array(0.5, 0.4, 0.1), 100) FROM VALUES (0), (1), (2), (10) AS tab(col);
+-------------------------------------------------+
|approx_percentile(col, array(0.5, 0.4, 0.1), 100)|
+-------------------------------------------------+
| [1, 1, 0]|
+-------------------------------------------------+
SELECT approx_percentile(col, 0.5, 100) FROM VALUES (0), (6), (7), (9), (10) AS tab(col);
+--------------------------------+
|approx_percentile(col, 0.5, 100)|
+--------------------------------+
| 7|
+--------------------------------+
avg(expr)
描述
返回一组值中计算得到的平均值。
实践
SELECT avg(col) FROM VALUES (1), (2), (3) AS tab(col);
+--------+
|avg(col)|
+--------+
| 2.0|
+--------+
SELECT avg(col) FROM VALUES (1), (2), (NULL) AS tab(col);
+--------+
|avg(col)|
+--------+
| 1.5|
+--------+
bit_and(expr)
描述
返回所有非空输入值按位与的结果,如果没有,则返回null。
实践
SELECT bit_and(col) FROM VALUES (3), (5) AS tab(col);
+------------+
|bit_and(col)|
+------------+
| 1|
+------------+
bit_or(expr)
描述
返回所有非空输入值按位或的结果,如果没有,则返回null。
实践
SELECT bit_or(col) FROM VALUES (3), (5) AS tab(col);
+-----------+
|bit_or(col)|
+-----------+
| 7|
+-----------+
bit_xor(expr)
描述
返回所有非空输入值按位异或的结果,如果没有,则返回null。
实践
SELECT bit_xor(col) FROM VALUES (3), (5) AS tab(col);
+------------+
|bit_xor(col)|
+------------+
| 6|
+------------+
bool_and(expr)
描述
如果expr
的所有值都是true,则返回true。
实践
SELECT bool_and(col) FROM VALUES (true), (true), (true) AS tab(col);
+-------------+
|bool_and(col)|
+-------------+
| true|
+-------------+
SELECT bool_and(col) FROM VALUES (NULL), (true), (true) AS tab(col);
+-------------+
|bool_and(col)|
+-------------+
| true|
+-------------+
SELECT bool_and(col) FROM VALUES (true), (false), (true) AS tab(col);
+-------------+
|bool_and(col)|
+-------------+
| false|
+-------------+
bool_or(expr)
描述
如果至少一个expr
值为真,则返回true。
实践
SELECT bool_or(col) FROM VALUES (true), (false), (false) AS tab(col);
+------------+
|bool_or(col)|
+------------+
| true|
+------------+
SELECT bool_or(col) FROM VALUES (NULL), (true), (false) AS tab(col);
+------------+
|bool_or(col)|
+------------+
| true|
+------------+
SELECT bool_or(col) FROM VALUES (false), (false), (NULL) AS tab(col);
+------------+
|bool_or(col)|
+------------+
| false|
+------------+
collect_list(expr)
描述
收集并返回非唯一元素列表。
实践
SELECT collect_list(col) FROM VALUES (1), (2), (1) AS tab(col);
+-----------------+
|collect_list(col)|
+-----------------+
| [1, 2, 1]|
+-----------------+
collect_set(expr)
描述
收集并返回一组独特的元素。
实践
SELECT collect_set(col) FROM VALUES (1), (2), (1) AS tab(col);
+----------------+
|collect_set(col)|
+----------------+
| [1, 2]|
+----------------+
corr(expr1,expr2)
描述
返回一组数字对之间的皮尔逊系数。
实践
SELECT corr(c1, c2) FROM VALUES (3, 2), (3, 3), (6, 4) as tab(c1, c2);
+------------------+
| corr(c1, c2)|
+------------------+
|0.8660254037844387|
+------------------+
做相似度计算的时候经常会用到皮尔逊相关系数(Pearson Correlation Coefficient)。
皮尔逊系数看作两组数据的向量夹角的余弦。
count(*)
描述
返回检索的行总数,包括那些包含 null 的行。
实践
SELECT count(*) FROM VALUES (NULL), (5), (5), (20) AS tab(col);
+--------+
|count(1)|
+--------+
| 4|
+--------+
count(expr[, expr…])
描述
- 返回行数。
expr
都是非空的。
实践
SELECT count(col) FROM VALUES (NULL), (5), (5), (20) AS tab(col);
+----------+
|count(col)|
+----------+
| 3|
+----------+
count(DISTINCT expr[, expr…])
描述
- 返回行数。
expr
都是唯一且非空的。
实践
SELECT count(DISTINCT col) FROM VALUES (NULL), (5), (5), (10) AS tab(col);
+-------------------+
|count(DISTINCT col)|
+-------------------+
| 2|
+-------------------+
count_if(expr)
描述
返回expr
的TRUE
值数量。
实践
SELECT count_if(col % 2 = 0) FROM VALUES (NULL), (0), (1), (2), (3) AS tab(col);
+-------------------------+
|count_if(((col % 2) = 0))|
+-------------------------+
| 2|
+-------------------------+
SELECT count_if(col IS NULL) FROM VALUES (NULL), (0), (1), (2), (3) AS tab(col);
+-----------------------+
|count_if((col IS NULL))|
+-----------------------+
| 1|
+-----------------------+
count_min_sketch(col, eps, confidence, seed)
描述
- 返回带有给定的
esp
、confidence
和seed
的列的count-min sketch
。 - 结果是一个字节数组,在使用前可以反序列化为
CountMinSketch
。 Count-min sketch
是一种概率数据结构,用于使用亚线性空间进行基数估计。
实践
SELECT hex(count_min_sketch(col, 0.5d, 0.5d, 1)) FROM VALUES (1), (2), (1) AS tab(col);
+---------------------------------------+
|hex(count_min_sketch(col, 0.5, 0.5, 1))|
+---------------------------------------+
| 00000001000000000...|
+---------------------------------------+
如果老板让你统计一个实时的数据流中元素出现的频率,并且准备随时回答某个元素出现的频率,不需要的精确的计数,那该怎么办?
直觉告诉我们可能需要一个巨大的 HashMap 来统计各个元素的出现频率,但由于不同的元素的个数可能非常大,以至于是个天文数字,要求的内存可能会非常大,从而不切实际。同时,又要求我们实时计算,实时回答,当HashMap的冲突很高时,最坏的情况的时间复杂度可能无法满足实时的要求。
加上前面要求不需要精确的计数,这么说来,必须寻找新的算法。
那么,Count-Min Sketch 就是用来解决此类问题的算法。
covar_pop(expr1,expr2)
描述
返回一组数字对的总体协方差。
实践
SELECT covar_pop(c1, c2) FROM VALUES (1,1), (2,2), (3,3) AS tab(c1, c2);
+------------------+
| covar_pop(c1, c2)|
+------------------+
|0.6666666666666666|
+------------------+
统计中的方差(样本方差)是每个样本值与全体样本值的平均数之差的平方值的平均数;
标准差是总体各单位标准值与其平均数离差平方的算术平均数的平方根;
协方差表示的是两个变量的总体的误差,这与只表示一个变量误差的方差不同。
covar_samp(expr1,expr2)
描述
返回一组数字对的样本协方差。
实践
SELECT covar_samp(c1, c2) FROM VALUES (1,1), (2,2), (3,3) AS tab(c1, c2);
+------------------+
|covar_samp(c1, c2)|
+------------------+
| 1.0|
+------------------+
every(expr)
描述
如果expr
的所有值都是true,则返回true。
实践
SELECT every(col) FROM VALUES (true), (true), (true) AS tab(col);
+----------+
|every(col)|
+----------+
| true|
+----------+
SELECT every(col) FROM VALUES (NULL), (true), (true) AS tab(col);
+----------+
|every(col)|
+----------+
| true|
+----------+
SELECT every(col) FROM VALUES (true), (false), (true) AS tab(col);
+----------+
|every(col)|
+----------+
| false|
+----------+
first(expr[, isIgnoreNull])
描述
- 返回一组行中
expr
的第一个值。 - 如果
isIgnoreNull
为真,则仅返回非空值。
实践
SELECT first(col) FROM VALUES (10), (5), (20) AS tab(col);
+----------+
|first(col)|
+----------+
| 10|
+----------+
SELECT first(col) FROM VALUES (NULL), (5), (20) AS tab(col);
+----------+
|first(col)|
+----------+
| null|
+----------+
SELECT first(col, true) FROM VALUES (NULL), (5), (20) AS tab(col);
+----------+
|first(col)|
+----------+
| 5|
+----------+
first_value(expr[, isIgnoreNull])
描述
- 返回一组行中
expr
的第一个值。 - 如果
isIgnoreNull
为真,则仅返回非空值。
实践
SELECT first_value(col) FROM VALUES (10), (5), (20) AS tab(col);
+----------------+
|first_value(col)|
+----------------+
| 10|
+----------------+
SELECT first_value(col) FROM VALUES (NULL), (5), (20) AS tab(col);
+----------------+
|first_value(col)|
+----------------+
| null|
+----------------+
SELECT first_value(col, true) FROM VALUES (NULL), (5), (20) AS tab(col);
+----------------+
|first_value(col)|
+----------------+
| 5|
+----------------+
= first(expr[, isIgnoreNull])
grouping(col)
描述
- 指示
GROUP BY
中的指定列是否聚合 - 聚合返回1
- 不聚合在结果集中返回0
实践
SELECT name, grouping(name), sum(age) FROM VALUES (2, 'Alice'), (5, 'Bob') people(age, name) GROUP BY cube(name);
+-----+--------------+--------+
| name|grouping(name)|sum(age)|
+-----+--------------+--------+
|Alice| 0| 2|
| Bob| 0| 5|
| null| 1| 7|
+-----+--------------+--------+
grouping_id([col1[, col2 …]])
描述
返回分组级别,等于(grouping(c1) << (n-1)) + (grouping(c2) << (n-2)) + ... + grouping(cn)
实践
SELECT name, grouping(name), sum(age) FROM VALUES (2, 'Alice'), (5, 'Bob') people(age, name) GROUP BY cube(name);
+-----+--------------+--------+
| name|grouping(name)|sum(age)|
+-----+--------------+--------+
|Alice| 0| 2|
| Bob| 0| 5|
| null| 1| 7|
+-----+--------------+--------+
kurtosis(expr)
描述
返回从一组值中计算得到的峰度。
实践
SELECT kurtosis(col) FROM VALUES (-10), (-20), (100), (1000) AS tab(col);
+-------------------+
| kurtosis(col)|
+-------------------+
|-0.7014368047529618|
+-------------------+
SELECT kurtosis(col) FROM VALUES (1), (10), (100), (10), (1) as tab(col);
+-------------------+
| kurtosis(col)|
+-------------------+
|0.19432323191698986|
+-------------------+
峰度(peakedness;kurtosis)又称峰态系数。表征概率密度分布曲线在平均值处峰值高低的特征数。直观看来,峰度反映了峰部的尖度。样本的峰度是和正态分布相比较而言统计量,如果峰度大于三,峰的形状比较尖,比正态分布峰要陡峭。反之亦然。
在统计学中,峰度(Kurtosis)衡量实数随机变量概率分布的峰态。峰度高就意味着方差增大是由低频度的大于或小于平均值的极端差值引起的。
last(expr[, isIgnoreNull])
描述
- 返回一组行
expr
的最后一个值。 - 如果
isIgnoreNull
为真,则仅返回非空值
实践
SELECT last(col) FROM VALUES (10), (5), (20) AS tab(col);
+---------+
|last(col)|
+---------+
| 20|
+---------+
SELECT last(col) FROM VALUES (10), (5), (NULL) AS tab(col);
+---------+
|last(col)|
+---------+
| null|
+---------+
SELECT last(col, true) FROM VALUES (10), (5), (NULL) AS tab(col);
+---------+
|last(col)|
+---------+
| 5|
+---------+
last_value(expr[, isIgnoreNull])
描述
- 返回一组行
expr
的最后一个值。 - 如果
isIgnoreNull
为真,则仅返回非空值
实践
SELECT last_value(col) FROM VALUES (10), (5), (20) AS tab(col);
+---------------+
|last_value(col)|
+---------------+
| 20|
+---------------+
SELECT last_value(col) FROM VALUES (10), (5), (NULL) AS tab(col);
+---------------+
|last_value(col)|
+---------------+
| null|
+---------------+
SELECT last_value(col, true) FROM VALUES (10), (5), (NULL) AS tab(col);
+---------------+
|last_value(col)|
+---------------+
| 5|
+---------------+
= last(expr[, isIgnoreNull])
max(expr)
描述
返回expr
的最大值。
实践
SELECT max(col) FROM VALUES (10), (50), (20) AS tab(col);
+--------+
|max(col)|
+--------+
| 50|
+--------+
max_by(x, y)
描述
返回与最大值“y”关联的“x”值。
实践
SELECT max_by(x, y) FROM VALUES (('a', 10)), (('b', 50)), (('c', 20)) AS tab(x, y);
+------------+
|max_by(x, y)|
+------------+
| b|
+------------+
mean(expr)
描述
返回从一组值中计算得到的平均值。
实践
SELECT mean(col) FROM VALUES (1), (2), (3) AS tab(col);
+---------+
|mean(col)|
+---------+
| 2.0|
+---------+
SELECT mean(col) FROM VALUES (1), (2), (NULL) AS tab(col);
+---------+
|mean(col)|
+---------+
| 1.5|
+---------+
min(expr)
描述
返回expr
的最小值。
实践
SELECT min(col) FROM VALUES (10), (-1), (20) AS tab(col);
+--------+
|min(col)|
+--------+
| -1|
+--------+
min_by(x, y)
描述
返回与最小值“y”关联的“x”值。
实践
SELECT min_by(x, y) FROM VALUES (('a', 10)), (('b', 50)), (('c', 20)) AS tab(x, y);
+------------+
|min_by(x, y)|
+------------+
| a|
+------------+
percentile(col, percentage [, frequency])
描述
- 以给定的百分比
percentage
返回数字列col
的确切百分位percentile
数值。 - 百分比
percentage
值必须在0.0到1.0之间。 frequency
值应该是正整数。
实践
SELECT percentile(col, 0.3) FROM VALUES (0), (10) AS tab(col);
+-----------------------+
|percentile(col, 0.3, 1)|
+-----------------------+
| 3.0|
+-----------------------+
percentile(col, array(percentage1 [, percentage2]…) [, frequency])
描述
- 以给定的百分比
percentages
返回数字列col
的确切百分位percentile
数值。 - 百分比
percentage
值必须在0.0到1.0之间。 frequency
值应该是正整数。
实践
SELECT percentile(col, array(0.25, 0.75)) FROM VALUES (0), (10) AS tab(col);
+-------------------------------------+
|percentile(col, array(0.25, 0.75), 1)|
+-------------------------------------+
| [2.5, 7.5]|
+-------------------------------------+
percentile_approx(col, percentage [, accuracy])
描述
- 返回数字列
col
的近似percentile
,这是有序col
值中最小的值(按照从小到大排序),因此小于等于该值不超过col
值的percentage
。 percentage
值必须在0.0到1.0之间。accuracy
参数(默认值:10000)是一个正数字文本,以内存为代价控制近似精度。accuracy
值越高,准确性就越高,1.0/accuracy
是近似值的相对误差。- 当
percentage
是一个数组时,百分比数组的每个值必须在0.0到1.0之间。在这种情况下,返回给定percentage
数组上列col
的近似percentile
数组。
实践
SELECT percentile_approx(col, array(0.5, 0.4, 0.1), 100) FROM VALUES (0), (1), (2), (10) AS tab(col);
+-------------------------------------------------+
|percentile_approx(col, array(0.5, 0.4, 0.1), 100)|
+-------------------------------------------------+
| [1, 1, 0]|
+-------------------------------------------------+
SELECT percentile_approx(col, 0.5, 100) FROM VALUES (0), (6), (7), (9), (10) AS tab(col);
+--------------------------------+
|percentile_approx(col, 0.5, 100)|
+--------------------------------+
| 7|
+--------------------------------+
= approx_percentile(col, percentage [, accuracy])
skewness(expr)
描述
返回从一组值中计算得到的偏度。
实践
SELECT skewness(col) FROM VALUES (-10), (-20), (100), (1000) AS tab(col);
+------------------+
| skewness(col)|
+------------------+
|1.1135657469022013|
+------------------+
SELECT skewness(col) FROM VALUES (-1000), (-100), (10), (20) AS tab(col);
+-------------------+
| skewness(col)|
+-------------------+
|-1.1135657469022011|
+-------------------+
偏度(skewness),是统计数据分布偏斜方向和程度的度量,是统计数据分布非对称程度的数字特征。偏度(Skewness)亦称偏态、偏态系数。
some(expr)
描述
如果至少一个expr
值为真,则返回true。
实践
SELECT some(col) FROM VALUES (true), (false), (false) AS tab(col);
+---------+
|some(col)|
+---------+
| true|
+---------+
SELECT some(col) FROM VALUES (NULL), (true), (false) AS tab(col);
+---------+
|some(col)|
+---------+
| true|
+---------+
SELECT some(col) FROM VALUES (false), (false), (NULL) AS tab(col);
+---------+
|some(col)|
+---------+
| false|
+---------+
std(expr)
描述
返回从一组值中计算得到的样本标准差。
实践
SELECT std(col) FROM VALUES (1), (2), (3) AS tab(col);
+--------+
|std(col)|
+--------+
| 1.0|
+--------+
标准差(Standard Deviation) ,是离均差平方的算术平均数(即:方差)的算术平方根,用σ表示。标准差也被称为标准偏差,或者实验标准差,在概率统计中最常使用作为统计分布程度上的测量依据。
标准差是方差的算术平方根。标准差能反映一个数据集的离散程度。平均数相同的两组数据,标准差未必相同。
stddev(expr)
描述
返回从一组值中计算得到的样本标准差。
实践
SELECT stddev(col) FROM VALUES (1), (2), (3) AS tab(col);
+-----------+
|stddev(col)|
+-----------+
| 1.0|
+-----------+
= std(expr)
stddev_pop(expr)
描述
返回从一组值中计算得到的总体标准差。
实践
SELECT stddev_pop(col) FROM VALUES (1), (2), (3) AS tab(col);
+-----------------+
| stddev_pop(col)|
+-----------------+
|0.816496580927726|
+-----------------+
stddev_samp(expr)
描述
返回从组值计算的样本标准偏差。
实践
SELECT stddev_samp(col) FROM VALUES (1), (2), (3) AS tab(col);
+----------------+
|stddev_samp(col)|
+----------------+
| 1.0|
+----------------+
sum(expr)
描述
返回从一组值中计算得到的总和。
实践
SELECT sum(col) FROM VALUES (5), (10), (15) AS tab(col);
+--------+
|sum(col)|
+--------+
| 30|
+--------+
SELECT sum(col) FROM VALUES (NULL), (10), (15) AS tab(col);
+--------+
|sum(col)|
+--------+
| 25|
+--------+
SELECT sum(col) FROM VALUES (NULL), (NULL) AS tab(col);
+--------+
|sum(col)|
+--------+
| null|
+--------+
var_pop(expr)
描述
返回从一组值中计算得到的总体方差。
实践
SELECT var_pop(col) FROM VALUES (1), (2), (3) AS tab(col);
+------------------+
| var_pop(col)|
+------------------+
|0.6666666666666666|
+------------------+
var_samp(expr)
描述
返回从一组值中计算得到的样本方差。
实践
SELECT var_samp(col) FROM VALUES (1), (2), (3) AS tab(col);
+-------------+
|var_samp(col)|
+-------------+
| 1.0|
+-------------+
variance(expr)
描述
返回从一组值中计算得到的样本方差。
实践
SELECT variance(col) FROM VALUES (1), (2), (3) AS tab(col);
+-------------+
|variance(col)|
+-------------+
| 1.0|
+-------------+
= var_samp(expr)