分区

适用于:勾选“是” Databricks SQL 勾选“是” Databricks Runtime

分区由表中的行子集组成,这些行对称为分区列的预定义列子集共享相同的值。 使用分区可以加速对表的查询以及数据操作。

要使用分区,你可以在创建表时通过包含 PARTITIONED BY 子句来定义分区列集。

在表中插入或操作行时,Azure Databricks 会自动将行分派到适当的分区中。

还可以使用 PARTITION 子句直接指定分区。

此语法也可用于未使用 Delta Lake 格式的表,以使用 ALTER TABLE 语句快速删除、添加或重命名分区。

PARTITIONED BY

PARTITIONED BY 子句指定了新表分区依据列的列表。

语法

PARTITIONED BY ( { partition_column [ column_type ] } [, ...] )

参数

  • partition_column

    标识符可以引用表中的 column_identifier。 如果指定多列,则不能有重复项。 如果引用表的 column_specification 中的所有列,则会引发错误。

  • column_type

    除非 partition_column 引用表的 column_specification 中的 column_identifier,否则 column_type 定义 partition_column 的数据类型。

    并非所有数据源都支持 Databricks SQL 支持的所有数据类型

注释

除非定义 Delta Lake 表分区列,否则引用列规范中的列总是移动到表的末尾。

PARTITION

使用 PARTITION 子句标识要查询或操作的分区。

通过命名分区的所有列并将每个列与值相关联来标识分区。 无需按特定顺序指定它们。

除非向现有表添加新分区,否则可以省略列或值以指示该操作适用于与列子集匹配的所有匹配分区。

PARTITION ( { partition_column  [ = partition_value | LIKE pattern ] } [ , ... ] )

参数

  • partition_column

    指定为表的分区列的列。 不能两次指定同一列。

  • = partition_value

    与分区列的类型匹配的数据类型的文本。 如果省略分区值,则规范将匹配此分区列的所有值。

  • LIKE pattern

    这种形式只允许在 ALTER SHARE ADD TABLE 中使用。

    partition_column 的字符串表示形式与 pattern 匹配。 pattern 必须是在 LIKE 中使用的字符串字面量。

示例

-- Use the PARTTIONED BY clause in a table definition
> CREATE TABLE student(university STRING,
                       major      STRING,
                       name       STRING)
         PARTITIONED BY(university, major)

> CREATE TABLE professor(name STRING)
         PARTITIONED BY(university STRING,
                        department STRING);

-- Use the PARTITION specification to INSERT into a table
> INSERT INTO student
         PARTITION(university= 'TU Kaiserslautern') (major, name)
         SELECT major, name FROM freshmen;

-- Use the partition specification to add and drop a partition
> CREATE TABLE log(date DATE, id INT, event STRING)
     USING CSV LOCATION 'dbfs:/log'
     PARTITIONED BY (date);

> ALTER TABLE log ADD PARTITION(date = DATE'2021-09-10');

> ALTER TABLE log DROP PARTITION(date = DATE'2021-09-10');

-- Drop all partitions from the named university, independent of the major.
> ALTER TABLE student DROP PARTITION(university = 'TU Kaiserslautern');