按簇分组子句
描述
CLUSTER BY
子句用于首先根据输入表达式对数据进行重新分区,然后在每个分区内对数据进行排序。这在语义上等同于先执行一个
DISTRIBUTE BY
,然后再执行一个
SORT BY
。此子句仅确保结果行在每个分区内已排序,并不保证输出的总体顺序。
语法
CLUSTER BY { 表达式 [ , ... ] }
参数
-
表达式
指定一个或多个值、运算符和 SQL 函数的组合,结果为一个值。
示例
CREATE TABLE person (name STRING, age INT);
INSERT INTO person VALUES
('Zen Hui', 25),
('Anil B', 18),
('Shone S', 16),
('Mike A', 25),
('John A', 18),
('Jack N', 16);
-- 减少洗牌分区数量为2,以说明`CLUSTER BY`的行为。
-- 分区数较少时,更容易观察到聚类和排序的行为。
SET spark.sql.shuffle.partitions = 2;
-- 选择没有排序的行。请注意,若没有任何排序指令,查询结果
-- 将不具有确定性。此处包含该查询是为了展示
-- 不使用`CLUSTER BY`与使用时行为的区别。以下查询生成的行
-- 年龄列未排序。
SELECT age, name FROM person;
+---+-------+
|age| name|
+---+-------+
| 16|Shone S|
| 25|Zen Hui|
| 16| Jack N|
| 25| Mike A|
| 18| John A|
| 18| Anil B|
+---+-------+
-- 生成按年龄聚类的行。相同年龄的人被聚集在一起。
-- 在下面的查询中,年龄为18和25的人在第一个分区,
-- 年龄为16的人在第二个分区。行根据
-- 每个分区内的年龄进行排序。
SELECT age, name FROM person CLUSTER BY age;
+---+-------+
|age| name|
+---+-------+
| 18| John A|
| 18| Anil B|
| 25|Zen Hui|
| 25| Mike A|
| 16|Shone S|
| 16| Jack N|
+---+-------+