读取多个文件
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.csv 与 flights2.csv:
SELECT *
FROM read_csv(['flights1.csv', 'flights2.csv']);
读取 CSV 文件 flights1.csv 与 flights2.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);
| FlightDate | OriginCityName | DestCityName | UniqueCarrier | filename |
|---|---|---|---|---|
| 1988-01-01 | New York, NY | Los Angeles, CA | NULL | flights1.csv |
| 1988-01-02 | New York, NY | Los Angeles, CA | NULL | flights1.csv |
| 1988-01-03 | New York, NY | Los Angeles, CA | AA | flights2.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 |