DuckDB 允许通过 read_text
和 read_blob
函数直接读取文件。
这些函数接受一个文件名、文件名列表或通配符模式,并将每个文件的内容分别输出为 VARCHAR
或 BLOB
,以及文件大小和最后修改时间等附加元数据。
read_text
read_text
表函数从选定的源读取到 VARCHAR
。每个文件生成一行,其中 content
字段包含相应文件的全部内容。
SELECT size, parse_path(filename), content
FROM read_text('test/sql/table_function/files/*.txt');
大小 | parse_path(filename) | 内容 |
---|---|---|
12 | [test, sql, table_function, files, one.txt] | 你好,世界! |
2 | [test, sql, table_function, files, three.txt] | 42 |
10 | [test, sql, table_function, files, two.txt] | Foo Bar\nFöö Bär |
文件内容首先被验证为有效的UTF-8。如果read_text
尝试读取包含无效UTF-8的文件,则会抛出错误,建议使用read_blob
代替。
read_blob
read_blob
表函数从选定的源读取到 BLOB
:
SELECT size, content, filename
FROM read_blob('test/sql/table_function/files/*');
大小 | 内容 | 文件名 |
---|---|---|
178 | PK\x03\x04\x0A\x00\x00\x00\x00\x00\xACi=X\x14t\xCE\xC7\x0A… | test/sql/table_function/files/four.blob |
12 | 你好,世界! | test/sql/table_function/files/one.txt |
2 | 42 | test/sql/table_function/files/three.txt |
10 | Föö Bär | test/sql/table_function/files/two.txt |
Schema
由read_text
和read_blob
返回的表的模式是相同的:
DESCRIBE FROM read_text('README.md');
列名 | 列类型 | 是否为空 | 键 | 默认值 | 额外信息 |
---|---|---|---|---|---|
文件名 | VARCHAR | 是 | 空 | 空 | 空 |
内容 | VARCHAR | 是 | 空 | 空 | 空 |
大小 | BIGINT | 是 | 空 | 空 | 空 |
last_modified | TIMESTAMP | YES | NULL | NULL | NULL |
处理缺失的元数据
在底层文件系统无法提供某些数据的情况下(例如,因为HTTPFS不能总是返回有效的时间戳),单元格将被设置为NULL
。
支持投影下推
表函数还利用投影下推来避免不必要地计算属性。因此,例如,您可以使用此功能来遍历一个包含大文件的目录以获取文件大小列中的文件大小,只要您省略内容列,数据就不会被读入DuckDB。