管道操作
适用对象: Databricks Runtime 16.2 及更高版本
使用链接操作处理上述查询结果。
语法
{ SELECT clause |
EXTEND { expression [ [ AS ] column_alias ] } [ , ...] |
SET { column_name = expression } [, ...] |
DROP column_name [, ...] |
AS table_alias |
WHERE clause |
{ LIMIT clause |
OFFSET clause |
LIMIT clause OFFSET clause } |
aggregation |
JOIN clause |
ORDER BY clause |
set_operator |
TABLESAMPLE clause
PIVOT clause
UNPIVOT clause }
aggregation
AGGREGATE aggregate_expr [ [ AS ] column_alias ] [, ...]
[ GROUP BY grouping_expr [AS column_alias ] ]
参数
-
收集要从查询返回的列,包括执行表达式和重复数据删除。
列列表不得包含聚合函数。 为此,请使用
AGGREGATE
操作。 EXTEND
将新列追加到查询选择列表中。
-
计算得出值的一个或多个值、运算符和 SQL 函数的组合。
expression
可能包含对查询选择列表中列的引用,以及对这个EXTEND
子句中前面column_alias
的引用。 -
命名表达式结果的可选列标识符。 如果未提供
column_alias
,Azure Databricks 会派生一个。
-
SET
使用新值替代查询选择列表中的现有列。
该操作按
SET
子句的出现顺序执行。 任何表达式的结果都可以观察到由前面表达式更新的列。-
要更新的列的名称。 如果该列不存在,Azure Databricks 将引发 UNRESOLVED_COLUMN 错误。
expression
计算得出值的一个或多个值、运算符和 SQL 函数的组合。
-
DROP column_name [, …]
从查询选择列表中删除列。
如果该列不存在,Azure Databricks 将引发 UNRESOLVED_COLUMN 错误。
AS table_alias
向查询结果分配名称。
-
根据提供的谓词筛选查询结果。
-
限制查询可返回的最大行数。 此子句通常遵循 ORDER BY 来生成确定性结果。
-
跳过查询返回的行数。 该子句通常与 LIMIT 结合使用,以对结果集进行分页,与 ORDER BY 结合使用以产生确定的结果。
聚合
根据提供的表达式和可选的分组表达式聚合查询的结果集。
此操作将生成一个结果集,其中分组列显示在聚合列之前。
-
使用联接合并两个或更多个关系。 有关详细信息,请参阅 JOIN。
-
对查询结果集的行进行排序。 输出行在分区之间排序。 此参数与
SORT BY
、CLUSTER BY
和DISTRIBUTE BY
互斥,不能一起指定。 -
使用
UNION
、EXCEPT
或INTERSECT
运算符将查询与一个或多个子查询合并。 -
通过仅对行的一小部分进行采样来减小结果集的大小。
-
用于数据透视。 可以根据特定的列值获取聚合值。 有关详细信息,请参阅 PIVOT。
-
用于数据透视。 可以将多个列组拆分为行。 有关详细信息,请参阅 UNPIVOT。
例子
-- This query
> FROM customer
|> LEFT OUTER JOIN orders ON c_custkey = o_custkey
AND o_comment NOT LIKE '%unusual%packages%'
|> AGGREGATE COUNT(o_orderkey) c_count
GROUP BY c_custkey
|> AGGREGATE COUNT(*) AS custdist
GROUP BY c_count
|> ORDER BY custdist DESC, c_count DESC;
is equivalent to:
> SELECT c_count, COUNT(*) AS custdist
FROM
(SELECT c_custkey, COUNT(o_orderkey) c_count
FROM customer
LEFT OUTER JOIN orders ON c_custkey = o_custkey
AND o_comment NOT LIKE '%unusual%packages%' GROUP BY c_custkey
) AS c_orders
GROUP BY c_count
ORDER BY custdist DESC, c_count DESC;
-- Using the SELECT clause following a FROM clause
> CREATE TABLE t AS VALUES (0), (1) AS t(col);
> FROM t
|> SELECT col * 2 AS result;
result
------
0
2
-- Adding columns to the result set
> VALUES (0), (1) tab(col)
|> EXTEND col * 2 AS result;
col result
--- ------
0 0
1 2
-- Replacing an expression
> VALUES (0), (1) tab(col)
|> SET col = col * 2;
col
---
0
2
-- Removing a column from the result set
> VALUES (0, 1) tab(col1, col2)
|> DROP col1;
col2
----
1
-- Using a table alias
> VALUES (0, 1) tab(col1, col2)
|> AS new_tab
|> SELECT col1 + col2 FROM new_tab;
col1 + col2
1
-- Filtering the result set
> VALUES (0), (1) tab(col)
|> WHERE col = 1;
col
---
1
-- Using LIMIT to truncate the result
> VALUES (0), (0) tab(col)
|> LIMIT 1;
col
---
0
-- Full-table aggregation
> VALUES (0), (1) tab(col)
|> AGGREGATE COUNT(col) AS count;
count
-----
2
-- Aggregation with grouping
> VALUES (0, 1), (0, 2) tab(col1, col2)
|> AGGREGATE COUNT(col2) AS count GROUP BY col1;
col1 count
---- -----
0 2
-- Using JOINs
> SELECT 0 AS a, 1 AS b
|> AS lhs
|> JOIN VALUES (0, 2) rhs(a, b) ON (lhs.a = rhs.a);
a b c d
--- --- --- ---
0 1 0 2
> VALUES ('apples', 3), ('bananas', 4) t(item, sales)
|> AS produce_sales
|> LEFT JOIN
(SELECT "apples" AS item, 123 AS id) AS produce_data
USING (item)
|> SELECT produce_sales.item, sales, id;
item sales id
--------- ------- ------
apples 3 123
bananas 4 NULL
-- Using ORDER BY
> VALUES (0), (1) tab(col)
|> ORDER BY col DESC;
col
---
1
0
> VALUES (0), (1) tab(a, b)
|> UNION ALL VALUES (2), (3) tab(c, d);
a b
--- ----
0 1
2 3
-- Sampling the result set
> VALUES (0), (0), (0), (0) tab(col)
|> TABLESAMPLE (1 ROWS);
col
---
0
> VALUES (0), (0) tab(col)
|> TABLESAMPLE (100 PERCENT);
col
---
0
0
-- Pivoting a query
> VALUES
("dotNET", 2012, 10000),
("Java", 2012, 20000),
("dotNET", 2012, 5000),
("dotNET", 2013, 48000),
("Java", 2013, 30000)
AS courseSales(course, year, earnings)
|> PIVOT (
SUM(earnings)
FOR COURSE IN ('dotNET', 'Java')
)
year dotNET Java
---- ------ ------
2012 15000 20000
2013 48000 30000
-- Using UNPIVOT
> VALUES
("dotNET", 2012, 10000),
("Java", 2012, 20000),
("dotNET", 2012, 5000),
("dotNET", 2013, 48000),
("Java", 2013, 30000)
AS courseSales(course, year, earnings)
|> UNPIVOT (
earningsYear FOR `year` IN (`2012`, `2013`, `2014`)
course year earnings
-------- ------ --------
Java 2012 20000
Java 2013 30000
dotNET 2012 15000
dotNET 2013 48000
dotNET 2014 22500