⌘+k ctrl+k
1.4 (LTS)
搜索快捷键 cmd + k | ctrl + k
读取多个文件

DuckDB 可以通过 glob 语法或提供文件列表,同时读取多种类型(CSV、Parquet、JSON 文件)的多个文件。有关读取具有不同模式(Schema)的文件的小技巧,请参阅合并模式页面。

CSV

读取文件夹 dir 中所有以 .csv 结尾的文件

SELECT *
FROM 'dir/*.csv';

读取两层目录深度内所有以 .csv 结尾的文件

SELECT *
FROM '*/*/*.csv';

读取文件夹 dir 中任意深度的所有以 .csv 结尾的文件

SELECT *
FROM 'dir/**/*.csv';

读取 CSV 文件 flights1.csvflights2.csv

SELECT *
FROM read_csv(['flights1.csv', 'flights2.csv']);

读取 CSV 文件 flights1.csvflights2.csv,按名称统一模式(Schema),并输出一个 filename

SELECT *
FROM read_csv(['flights1.csv', 'flights2.csv'], union_by_name = true, filename = true);

Parquet

读取所有匹配 glob 模式的文件

SELECT *
FROM 'test/*.parquet';

读取三个 Parquet 文件并将它们视为单个表

SELECT *
FROM read_parquet(['file1.parquet', 'file2.parquet', 'file3.parquet']);

读取两个特定文件夹中的所有 Parquet 文件

SELECT *
FROM read_parquet(['folder1/*.parquet', 'folder2/*.parquet']);

读取任意深度下所有匹配 glob 模式的 Parquet 文件

SELECT *
FROM read_parquet('dir/**/*.parquet');

多文件读取与 Glob

DuckDB 还可以读取一系列 Parquet 文件并将它们视为单个表。请注意,这仅在 Parquet 文件具有相同模式(Schema)时有效。您可以使用列表参数、glob 模式匹配语法或两者的组合来指定要读取的 Parquet 文件。

列表参数

read_parquet 函数可以接受文件名列表作为输入参数。

读取三个 Parquet 文件并将它们视为单个表

SELECT *
FROM read_parquet(['file1.parquet', 'file2.parquet', 'file3.parquet']);

Glob 语法

传递给 read_parquet 函数的任何文件名输入既可以是精确的文件名,也可以使用 glob 语法来读取匹配特定模式的多个文件。

通配符 描述
* 匹配任意数量的任意字符(包括零个字符)
** 匹配任意数量的子目录(包括零个)
? 匹配任意单个字符
[abc] 匹配方括号中给出的其中一个字符
[a-z] 匹配方括号中给出的范围内的其中一个字符

请注意,由于 HTTP 编码问题,glob 中的 ? 通配符不支持 S3 上的读取操作。

以下是一个读取 test 文件夹中所有以 .parquet 结尾的文件的示例

读取所有匹配 glob 模式的文件

SELECT *
FROM read_parquet('test/*.parquet');

Glob 列表

可以将 glob 语法和列表输入参数结合使用,以扫描满足多个模式之一的文件。

读取 2 个特定文件夹中的所有 Parquet 文件。

SELECT *
FROM read_parquet(['folder1/*.parquet', 'folder2/*.parquet']);

DuckDB 可以通过 glob 语法或提供文件列表同时读取多个 CSV 文件。

文件名

filename 参数可用于向结果添加一个额外的 filename 列,以指示每一行来自哪个文件。例如

SELECT *
FROM read_csv(['flights1.csv', 'flights2.csv'], union_by_name = true, filename = true);
航班日期 出发城市名称 目的城市名称 唯一承运人 文件名
1988-01-01 New York, NY Los Angeles, CA NULL flights1.csv
1988-01-02 New York, NY Los Angeles, CA NULL flights1.csv
1988-01-03 New York, NY Los Angeles, CA AA flights2.csv

filename 参数也接受字符串(例如 filename = 'input_file')。提供后,该字符串将用作所添加列的名称。当源数据中已经包含 filename 列且您希望避免名称冲突时,这非常有用。

用于查找文件名的 Glob 函数

glob 模式匹配语法还可以使用 glob 表函数来搜索文件名。它接受一个参数:要搜索的路径(可以包含 glob 模式)。

在当前目录中搜索所有文件。

SELECT *
FROM glob('*');
文件
test.csv
test.json
test.parquet
test2.csv
test2.parquet
todos.json

本节页面

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