⌘+k ctrl+k
1.3 (稳定版)
搜索快捷键 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 标志时,列的值将从目录中读取。

过滤器下推

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

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_typesDATETIMESTAMPBIGINT。要关闭自动检测,可以将标志 hive_types_autocast = 0 设置为。

写入分区文件

请参阅分区写入部分。