SELECT
描述
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 , ... ] [ ALL | DISTINCT ] { [ [ named_expression | regex_column_names ] [ , ... ] | TRANSFORM (...) ] }
FROM { from_item [ , ... ] }
[ PIVOT clause ]
[ UNPIVOT clause ]
[ LATERAL VIEW clause ] [ ... ]
[ WHERE boolean_expression ]
[ GROUP BY expression [ , ... ] ]
[ HAVING boolean_expression ]
参数
-
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 子句用于在执行分组后过滤行。如果指定了 HAVING 但没有 GROUP BY,则表示没有分组表达式的 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 函数的组合,这些值、运算符和 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 风格的转换查询规范,通过派生和运行用户指定的命令或脚本来转换输入。