⌘+k ctrl+k
1.1.3 (stable)
Search Shortcut cmd + k | ctrl + k
Hive Partitioning

Examples

从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 = true);  -- will include year, month partition columns
FROM read_parquet('test/*/*/*.parquet', hive_partitioning = false); -- will not include year, month columns

Hive Partitioning

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_types 将自动检测以下类型:DATETIMESTAMPBIGINT。要关闭自动检测,可以设置标志 hive_types_autocast = 0

写入分区文件

请参阅分区写入部分。