选择
描述
Spark支持
SELECT
语句,并符合ANSI SQL标准。查询用于从一个或多个表中检索结果集。以下部分描述了整体查询语法,子部分涵盖查询的不同构造以及示例。
语法
[ WITH with_query [ , ... ] ]
select_statement [ { UNION | INTERSECT | EXCEPT } [ ALL | DISTINCT ] select_statement, ... ]
[ ORDER BY { expression [ ASC | DESC ] [ NULLS { FIRST | LAST } ] [ , ... ] } ]
[ SORT BY { expression [ ASC | DESC ] [ NULLS { FIRST | LAST } ] [ , ... ] } ]
[ CLUSTER BY { expression [ , ... ] } ]
[ DISTRIBUTE BY { expression [, ... ] } ]
[ WINDOW { named_window [ , WINDOW named_window, ... ] } ]
[ LIMIT { ALL | expression } ]
当
select_statement
被定义为
SELECT [ hints , ... ] [ 所有 | 独特 ] { [ [ 命名表达式 | 正则表达式列名 ] [ , ... ] | 变换 (...) ] }
FROM { from_item [ , ... ] }
[ 透视 子句 ]
[ 反透视 子句 ]
[ 侧视 视图 子句 ] [ ... ]
[ WHERE 布尔表达式 ]
[ GROUP BY 表达式 [ , ... ] ]
[ HAVING 布尔表达式 ]
参数
-
with_query
指定在主查询块之前的 公共表表达式(CTE) 。这些表表达式可以在FROM子句中稍后引用。这对抽象出FROM子句中的重复子查询块非常有用,并提高查询的可读性。
-
hints
可以指定提示,帮助spark优化器做出更好的规划决策。目前,spark支持影响连接策略选择和数据重新分区的提示。
-
ALL
从关系中选择所有匹配的行,默认启用。
-
DISTINCT
在结果中选择从关系中消除重复后的所有匹配行。
-
named_expression
具有指定名称的表达式。一般而言,它表示一个列表达式。
语法:
expression [[AS] alias]
-
from_item
指定查询的输入源。它可以是以下之一:
-
PIVOT
PIVOT
子句用于数据的透视;我们可以根据特定列的值获取聚合值。 -
UNPIVOT
UNPIVOT
子句将列转换为行。它是PIVOT
的反向操作,除了聚合值。 -
LATERAL VIEW
LATERAL VIEW
子句与生成函数(如EXPLODE
)结合使用,这将生成一个包含一行或多行的虚拟表。LATERAL VIEW
将这些行应用于每个原始输出行。 -
WHERE
根据提供的谓词过滤FROM子句的结果。
-
GROUP BY
指定用于对行进行分组的表达式。这与聚合函数(MIN, MAX, COUNT, SUM, AVG等)结合使用,用于根据分组表达式对行进行分组并聚合每个组中的值。当将FILTER子句附加到聚合函数时,仅匹配的行会传递给该函数。
-
HAVING
指定通过GROUP BY生成的行过滤的谓词。HAVING子句用于在分组执行后过滤行。如果没有GROUP BY而指定HAVING,则表示没有分组表达式的GROUP BY(全局聚合)。
-
ORDER BY
指定查询的完整结果集的行的排序。输出行在分区中排序。此参数与
SORT BY
、CLUSTER BY
和DISTRIBUTE BY
互斥,不能一起指定。 -
SORT BY
指定在每个分区内行的排序顺序。此参数与
ORDER BY
和CLUSTER BY
互斥,不能一起指定。 -
CLUSTER BY
指定用于重新分区和排序行的一组表达式。使用此子句的效果与同时使用
DISTRIBUTE BY
和SORT BY
相同。 -
DISTRIBUTE BY
指定一组表达式,由此结果行重新分区。此参数与
ORDER BY
和CLUSTER BY
互斥,不能一起指定。 -
LIMIT
指定语句或子查询可以返回的最大行数。此子句通常与
ORDER BY
结合使用,以产生确定性的结果。 -
boolean_expression
指定任何评估为
boolean
结果类型的表达式。可以使用逻辑运算符(AND
、OR
)将两个或多个表达式组合在一起。 -
expression
指定一个或多个值、运算符和SQL函数的组合,该组合评估为一个值。
-
named_window
指定一个或多个源窗口规范的别名。源窗口规范可以在查询的窗口定义中引用。
-
regex_column_names
当
spark.sql.parser.quotedRegexColumnNames
为true时,SELECT
语句中使用反引号的引用标识符将被解释为正则表达式,并且SELECT
语句可以使用基于正则表达式的列规范。例如,下面的SQL将只使用列c
:SELECT `(a|b)?+.+` FROM ( SELECT 1 as a, 2 as b, 3 as c )
-
TRANSFORM
指定一个hive风格的转换查询规范,通过分叉和运行用户指定的命令或脚本来转换输入。