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分区文件层次结构的示例。文件按两个键(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
。
写入分区文件
请参阅分区写入部分。