示例
读取单个 Parquet 文件
SELECT * FROM 'test.parquet';
确定 Parquet 文件中的列/类型
DESCRIBE SELECT * FROM 'test.parquet';
从 Parquet 文件创建表
CREATE TABLE test AS
SELECT * FROM 'test.parquet';
如果文件没有以 .parquet
结尾,请使用 read_parquet
函数
SELECT *
FROM read_parquet('test.parq');
使用列表参数读取三个 Parquet 文件并将它们视为单个表
SELECT *
FROM read_parquet(['file1.parquet', 'file2.parquet', 'file3.parquet']);
读取所有匹配 glob 模式的文件
SELECT *
FROM 'test/*.parquet';
读取所有匹配 glob 模式的文件,并包含指定每行来自哪个文件的 filename
虚拟列(此列自 DuckDB v1.3.0 起默认可用,无需配置选项)
SELECT *, filename
FROM read_parquet('test/*.parquet');
使用 glob 列表读取两个特定文件夹中的所有 Parquet 文件
SELECT *
FROM read_parquet(['folder1/*.parquet', 'folder2/*.parquet']);
通过 HTTPS 读取
SELECT *
FROM read_parquet('https://some.url/some_file.parquet');
SELECT *
FROM parquet_metadata('test.parquet');
SELECT *
FROM parquet_file_metadata('test.parquet');
SELECT *
FROM parquet_kv_metadata('test.parquet');
SELECT *
FROM parquet_schema('test.parquet');
使用默认压缩(Snappy)将查询结果写入 Parquet 文件
COPY
(SELECT * FROM tbl)
TO 'result-snappy.parquet'
(FORMAT parquet);
将查询结果写入具有特定压缩和行组大小的 Parquet 文件
COPY
(FROM generate_series(100_000))
TO 'test.parquet'
(FORMAT parquet, COMPRESSION zstd, ROW_GROUP_SIZE 100_000);
将整个数据库的表内容导出为 Parquet
EXPORT DATABASE 'target_directory' (FORMAT parquet);
Parquet 文件
Parquet 文件是压缩的列式文件,加载和处理效率很高。DuckDB 支持高效地读取和写入 Parquet 文件,并支持将过滤器和投影下推到 Parquet 文件扫描中。
Parquet 数据集因文件数量、单个文件大小、使用的压缩算法、行组大小等而异。这些因素对性能有显著影响。有关详细信息,请查阅 性能指南。
read_parquet
函数
函数 | 描述 | 示例 |
---|---|---|
read_parquet(路径或路径列表) |
读取 Parquet 文件 | SELECT * FROM read_parquet('test.parquet'); |
parquet_scan(路径或路径列表) |
read_parquet 的别名 |
SELECT * FROM parquet_scan('test.parquet'); |
如果您的文件以 .parquet
结尾,则函数语法是可选的。系统将自动推断您正在读取 Parquet 文件
SELECT * FROM 'test.parquet';
可以通过提供 glob 或文件列表一次读取多个文件。有关更多信息,请参阅多文件部分。
参数
有许多可用的选项可以传递给 read_parquet
函数或 COPY
语句。
名称 | 描述 | 类型 | 默认值 |
---|---|---|---|
binary_as_string |
传统写入器生成的 Parquet 文件未正确设置字符串的 UTF8 标志,导致字符串列被加载为 BLOB 。将其设置为 true 可将二进制列作为字符串加载。 |
BOOL |
false |
encryption_config |
用于 Parquet 加密 的配置。 | STRUCT |
- |
文件名 |
结果中是否应包含一个额外的 filename 列。自 DuckDB v1.3.0 起,filename 列已作为虚拟列自动添加,此选项仅为兼容性原因而保留。 |
BOOL |
false |
file_row_number |
是否包含 file_row_number 列。 |
BOOL |
false |
hive_partitioning |
是否将路径解释为 Hive 分区路径。 | BOOL |
(自动检测) |
union_by_name |
多个模式的列是否应按 名称而不是按位置进行合并。 | BOOL |
false |
部分读取
DuckDB 支持将投影下推到 Parquet 文件本身。也就是说,在查询 Parquet 文件时,只读取查询所需的列。这使您能够只读取 Parquet 文件中您感兴趣的部分。这将由 DuckDB 自动完成。
DuckDB 还支持将过滤器下推到 Parquet 读取器中。当您对从 Parquet 文件扫描的列应用过滤器时,过滤器将被下推到扫描中,甚至可以使用内置的区域图跳过文件的部分内容。请注意,这取决于您的 Parquet 文件是否包含区域图。
过滤器和投影下推提供了显著的性能优势。有关更多信息,请参阅 我们的博客文章“使用 DuckDB 精确查询 Parquet”。
插入和视图
您还可以将数据插入到表中,或直接从 Parquet 文件创建表。这将从 Parquet 文件加载数据并将其插入到数据库中
将 Parquet 文件中的数据插入到表中
INSERT INTO people
SELECT * FROM read_parquet('test.parquet');
直接从 Parquet 文件创建表
CREATE TABLE people AS
SELECT * FROM read_parquet('test.parquet');
如果您希望将数据存储在 Parquet 文件中,但又想直接查询 Parquet 文件,则可以在 read_parquet
函数上创建视图。然后,您可以像查询内置表一样查询 Parquet 文件
创建 Parquet 文件的视图
CREATE VIEW people AS
SELECT * FROM read_parquet('test.parquet');
查询 Parquet 文件
SELECT * FROM people;
写入 Parquet 文件
DuckDB 还支持使用 COPY
语句语法写入 Parquet 文件。有关详细信息,包括 COPY
语句的所有可能参数,请参阅 COPY
语句页面。
将查询写入 Snappy 压缩的 Parquet 文件
COPY
(SELECT * FROM tbl)
TO 'result-snappy.parquet'
(FORMAT parquet);
将 tbl
写入 zstd 压缩的 Parquet 文件
COPY tbl
TO 'result-zstd.parquet'
(FORMAT parquet, COMPRESSION zstd);
将 tbl
写入具有最低压缩级别(提供最快压缩)的 zstd 压缩 Parquet 文件
COPY tbl
TO 'result-zstd.parquet'
(FORMAT parquet, COMPRESSION zstd, COMPRESSION_LEVEL 1);
写入带有 键值元数据 的 Parquet 文件
COPY (
SELECT
42 AS number,
true AS is_even
) TO 'kv_metadata.parquet' (
FORMAT parquet,
KV_METADATA {
number: 'Answer to life, universe, and everything',
is_even: 'not ''odd''' -- single quotes in values must be escaped
}
);
将 CSV 文件写入未压缩的 Parquet 文件
COPY
'test.csv'
TO 'result-uncompressed.parquet'
(FORMAT parquet, COMPRESSION uncompressed);
将查询写入具有 zstd 压缩和行组大小的 Parquet 文件
COPY
(FROM generate_series(100_000))
TO 'row-groups-zstd.parquet'
(FORMAT parquet, COMPRESSION zstd, ROW_GROUP_SIZE 100_000);
将数据写入 LZ4 压缩的 Parquet 文件
COPY
(FROM generate_series(100_000))
TO 'result-lz4.parquet'
(FORMAT parquet, COMPRESSION lz4);
或者,等效地
COPY
(FROM generate_series(100_000))
TO 'result-lz4.parquet'
(FORMAT parquet, COMPRESSION lz4_raw);
将数据写入 Brotli 压缩的 Parquet 文件
COPY
(FROM generate_series(100_000))
TO 'result-brotli.parquet'
(FORMAT parquet, COMPRESSION brotli);
要配置 Parquet 文件字典页的页面大小,请使用 STRING_DICTIONARY_PAGE_SIZE_LIMIT
选项(默认值:1 MB)
COPY
lineitem
TO 'lineitem-with-custom-dictionary-size.parquet'
(FORMAT parquet, STRING_DICTIONARY_PAGE_SIZE_LIMIT 100_000);
DuckDB 的 EXPORT
命令可用于将整个数据库导出为一系列 Parquet 文件。有关更多详细信息,请参阅 “EXPORT
语句”页面
将整个数据库的表内容导出为 Parquet
EXPORT DATABASE 'target_directory' (FORMAT parquet);
加密
DuckDB 支持读取和写入加密的 Parquet 文件。
支持的特性
支持的 Parquet 特性列表可在 Parquet 文档的“实现状态”页面中找到。
安装和加载 Parquet 扩展
对 Parquet 文件的支持是通过扩展启用的。parquet
扩展几乎与所有客户端捆绑在一起。但是,如果您的客户端未捆绑 parquet
扩展,则必须单独安装该扩展。
INSTALL parquet;