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

DuckDB 允许通过 read_textread_blob 函数直接读取文件。这些函数接受文件名、文件名列表或 glob 模式作为参数。它们分别将每个文件的内容作为 VARCHARBLOB 输出,并附带诸如文件大小和最后修改时间等元数据。

read_text

read_text 表函数从选定的源读取内容并转换为 VARCHAR。每个文件对应一行记录,content 字段中包含相应文件的全部内容。

SELECT size, parse_path(filename), content
FROM read_text('test/sql/table_function/files/*.txt');
size parse_path(filename) content
12 [test, sql, table_function, files, one.txt] Hello World!
2 [test, sql, table_function, files, three.txt] 42
10 [test, sql, table_function, files, two.txt] Foo Bar\nFöö Bär

DuckDB 会首先验证文件内容是否为有效的 UTF-8 编码。如果 read_text 尝试读取含有无效 UTF-8 的文件,DuckDB 将会报错并建议改用 read_blob

read_blob

read_blob 表函数从选定的源读取内容并转换为 BLOB

SELECT size, content, filename
FROM read_blob('test/sql/table_function/files/*');
size content 文件名
178 PK\x03\x04\x0A\x00\x00\x00\x00\x00\xACi=X\x14t\xCE\xC7\x0A… test/sql/table_function/files/four.blob
12 Hello World! test/sql/table_function/files/one.txt
2 42 test/sql/table_function/files/three.txt
10 F\xC3\xB6\xC3\xB6 B\xC3\xA4r test/sql/table_function/files/two.txt

模式

read_textread_blob 返回的表模式(Schema)是相同的。

DESCRIBE FROM read_text('README.md');
列名 (column_name) 列类型 (column_type) null key 默认值 (default) 额外信息 (extra)
文件名 VARCHAR 是 (YES) NULL NULL NULL
content VARCHAR 是 (YES) NULL NULL NULL
size BIGINT 是 (YES) NULL NULL NULL
last_modified TIMESTAMP 是 (YES) NULL NULL NULL

Hive 分区

可以从 Hive 分区数据集读取数据。

SELECT *
FROM read_blob('data/parquet-testing/hive-partitioning/simple/**/*.parquet')
WHERE part IN ('a', 'b') AND date >= '2012-01-01';
文件名 content size last_modified date part
…/part=a/date=2012-01-01/test.parquet PAR1\x15\x00\x15\x14\x15\x18… 266 2024-11-12 02:23:20+00 2012-01-01 a
…/part=b/date=2013-01-01/test.parquet PAR1\x15\x00\x15\x14\x15\x18… 266 2024-11-12 02:23:20+00 2013-01-01 b

处理缺失的元数据

当底层文件系统无法提供相关数据时(例如,HTTPFS 可能并不总是返回有效的时间戳),该单元格将被设为 NULL

投影下推支持

这些表函数也利用投影下推(Projection Pushdown)来避免不必要的计算。例如,你可以对包含大量文件的目录使用 glob 模式来获取 size 列中的文件大小。只要省略 content 列,DuckDB 就不会读取文件本身的数据。

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