直接读取文件
Goose 支持通过 read_text 与 read_blob 函数直接读取文件。
这些函数接受单个文件名、文件名列表或 glob 模式。它们分别将每个文件内容输出为 VARCHAR 或 BLOB,并附带文件大小、最后修改时间等元数据。
read_text
read_text table function 会把选定来源读取为 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 |
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/*');
| size | content | filename |
|---|---|---|
| 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_blob允许的最大文件大小为 3.9 GiB。
Schema
read_text 与 read_blob 返回表的 schema 相同:
DESCRIBE FROM read_text('README.mdx');
| column_name | column_type | null | key | default | extra |
|---|---|---|---|---|---|
| filename | 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';
| filename | 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。
投影下推支持
这些 table function 也使用投影下推,以避免不必要的属性计算。例如,你可以对包含大文件的目录做 glob 并仅读取 size 列获取文件大小。只要不选择 content 列,Goose 就不会读取文件数据。