Hive 分区
示例
读取 Hive 分区数据集中的数据:
SELECT *
FROM read_parquet('orders/*/*/*.parquet', hive_partitioning = true);
将表写入 Hive 分区数据集:
COPY orders
TO 'orders' (FORMAT parquet, PARTITION_BY (year, month));
注意:PARTITION_BY 选项中不能直接写表达式。你可以通过如下语法先生成列再写入:
COPY (SELECT *, year(timestamp) AS year, month(timestamp) AS month FROM services)
TO 'test' (PARTITION_BY (year, month));
读取时,分区列会从目录结构中解析出来,并可通过 hive_partitioning 参数决定是否包含这些列。
FROM read_parquet('test/*/*/*.parquet', hive_partitioning = false); -- will not include year, month columns
FROM read_parquet('test/*/*/*.parquet', hive_partitioning = true); -- will include year, month partition columns
Hive 分区
Hive 分区是一种分区策略:根据分区键将一张表拆分为多个文件。文件按目录组织,每个目录名决定该层级对应分区键的值。
下面是一个 Hive 分区文件层级示例。文件按两个分区键(year 与 month)组织。
orders
├── year=2021
│ ├── month=1
│ │ ├── file1.parquet
│ │ └── file2.parquet
│ └── month=2
│ └── file3.parquet
└── year=2022
├── month=11
│ ├── file4.parquet
│ └── file5.parquet
└── month=12
└── file6.parquet
使用 hive_partitioning 标志可读取该层级中的文件。
SELECT *
FROM read_parquet('orders/*/*/*.parquet', hive_partitioning = true);
当指定 hive_partitioning 后,分区列值会从目录名中读取。
过滤下推
针对分区键的过滤条件会自动下推到文件层面,从而跳过回答查询所不需要读取的文件。比如在上述数据集上执行:
SELECT *
FROM read_parquet('orders/*/*/*.parquet', hive_partitioning = true)
WHERE year = 2022
AND month = 11;
执行该查询时,只会读取以下文件:
orders
└── year=2022
└── month=11
├── file4.parquet
└── file5.parquet
自动检测
默认情况下,系统会尝试判断给定文件是否位于 Hive 分区目录层级中。若是,则自动启用 hive_partitioning。自动检测会检查目录名是否符合 'key' = 'value' 模式。可通过 hive_partitioning 配置项覆盖该行为:
SET hive_partitioning = false;
Hive 类型
hive_types 用于在结构体中显式指定 Hive 分区列的逻辑类型:
SELECT *
FROM read_parquet(
'dir/**/*.parquet',
hive_partitioning = true,
hive_types = {'release': DATE, 'orders': BIGINT}
);
hive_types 对以下类型支持自动检测:DATE、TIMESTAMP、BIGINT。如需关闭自动检测,可设置 hive_types_autocast = 0。
写出分区文件
See the Partitioned Writes section.