跳到主要内容

读取多个文件

Goose 可以同时读取多种类型的多个文件(CSV、Parquet、JSON),既可使用 glob 语法,也可直接传入文件列表。 关于读取不同 schema 文件的建议,请参阅合并 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';

读取 3 个 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

Goose 还支持把一组 Parquet 文件按单表方式读取。注意:这只在这些 Parquet 文件 schema 一致时有效。你可以通过文件列表、glob 模式,或二者组合来指定读取文件。

列表参数

read_parquet 可接收文件名列表作为输入参数。

读取 3 个 Parquet 文件并将其视为一张表:

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

Glob 语法

传给 read_parquet 的文件名参数既可以是精确文件名,也可以使用 glob 语法匹配多个文件。

通配符说明
*匹配任意数量的任意字符(可为 0 个)
**匹配任意数量子目录(可为 0 个)
?匹配任意单个字符
[abc]匹配方括号中给出的任一字符
[a-z]匹配方括号范围中的任一字符

注意:由于 HTTP 编码问题,S3 场景下不支持 glob 里的 ? 通配符。

下面示例读取 test 目录下所有以 .parquet 结尾的文件:

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

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

Glob 列表

glob 语法与列表参数可以组合使用,以扫描满足多个模式之一的文件。

读取两个指定目录中的全部 Parquet 文件。

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

Goose 也能通过 glob 或文件列表同时读取多个 CSV 文件。

Filename 列

filename 参数可为结果新增 filename 列,用于标识每行来自哪个文件。例如:

SELECT *
FROM read_csv(['flights1.csv', 'flights2.csv'], union_by_name = true, filename = true);
FlightDateOriginCityNameDestCityNameUniqueCarrierfilename
1988-01-01New York, NYLos Angeles, CANULLflights1.csv
1988-01-02New York, NYLos Angeles, CANULLflights1.csv
1988-01-03New York, NYLos Angeles, CAAAflights2.csv

filename 参数也可接收字符串(如 filename = 'input_file')。此时该字符串会作为新增列名。这在源数据已包含 filename 列、需要避免重名时非常有用。

使用 Glob 函数查找文件名

glob 匹配语法也可用于通过 glob 表函数查找文件名。 该函数接收一个参数:要搜索的路径(可包含 glob 模式)。

搜索当前目录中的全部文件。

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