跳到主要内容

直接读取文件

Goose 支持通过 read_textread_blob 函数直接读取文件。 这些函数接受单个文件名、文件名列表或 glob 模式。它们分别将每个文件内容输出为 VARCHARBLOB,并附带文件大小、最后修改时间等元数据。

read_text

read_text table function 会把选定来源读取为 VARCHAR。每个文件对应一行,content 字段包含该文件完整内容。

SELECT size, parse_path(filename), content
FROM read_text('test/sql/table_function/files/*.txt');
sizeparse_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

Goose 会先校验文件内容是否为有效 UTF-8。若 read_text 读取到无效 UTF-8 文件,Goose 会抛错并建议改用 read_blob

read_text 允许的最大文件大小为 3.9 GiB。

read_blob

read_blob table function 会把选定来源读取为 BLOB

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

read_blob 允许的最大文件大小为 3.9 GiB。

Schema

read_textread_blob 返回表的 schema 相同:

DESCRIBE FROM read_text('README.mdx');
column_namecolumn_typenullkeydefaultextra
filenameVARCHARYESNULLNULLNULL
contentVARCHARYESNULLNULLNULL
sizeBIGINTYESNULLNULLNULL
last_modifiedTIMESTAMPYESNULLNULLNULL

Hive 分区

支持从 Hive 分区数据集读取数据。

SELECT *
FROM read_blob('data/parquet-testing/hive-partitioning/simple/**/*.parquet')
WHERE part IN ('a', 'b') AND date >= '2012-01-01';
filenamecontentsizelast_modifieddatepart
…/part=a/date=2012-01-01/test.parquetPAR1\x15\x00\x15\x14\x15\x18…2662024-11-12 02:23:20+002012-01-01a
…/part=b/date=2013-01-01/test.parquetPAR1\x15\x00\x15\x14\x15\x18…2662024-11-12 02:23:20+002013-01-01b

处理缺失元数据

当底层文件系统无法提供这些数据时(例如 HTTPFS 可能无法始终返回有效时间戳),对应单元格会被设为 NULL

投影下推支持

这些 table function 也使用投影下推,以避免不必要的属性计算。例如,你可以对包含大文件的目录做 glob 并仅读取 size 列获取文件大小。只要不选择 content 列,Goose 就不会读取文件数据。