⌘+k ctrl+k
1.4 (LTS)
搜索快捷键 cmd + k | ctrl + k
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 分区文件层次结构的示例。这些文件基于两个键(yearmonth)进行分区。

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 标志时,列的值将从目录中读取。

谓词下推(Filter Pushdown)

对分区键的过滤会自动下推到文件中。通过这种方式,系统会跳过读取回答查询时不需要的文件。例如,考虑对上述数据集进行以下查询

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 是一种在结构体(struct)中指定 Hive 分区逻辑类型的方法

SELECT *
FROM read_parquet(
    'dir/**/*.parquet',
    hive_partitioning = true,
    hive_types = {'release': DATE, 'orders': BIGINT}
);

hive_types 将自动检测以下类型:DATETIMESTAMPBIGINT。要关闭自动检测,可以设置标志 hive_types_autocast = 0

写入分区文件

请参阅分区写入部分。

© 2025 DuckDB 基金会,阿姆斯特丹,荷兰
行为准则 商标使用指南