Examples
读取一组CSV文件,按位置合并列:
SELECT * FROM read_csv('flights*.csv');
读取一组CSV文件,按名称合并列:
SELECT * FROM read_csv('flights*.csv', union_by_name = true);
组合模式
当从多个文件读取时,我们必须合并这些文件的模式。这是因为每个文件都有自己的模式,可能与其他文件不同。DuckDB提供了两种统一多个文件模式的方法:按列位置和按列名称。
默认情况下,DuckDB读取提供的第一个文件的模式,然后通过列位置统一后续文件中的列。只要所有文件具有相同的模式,这种方法就能正常工作。如果文件的模式不同,您可能需要使用union_by_name
选项,以允许DuckDB通过读取所有名称来构建模式。
以下是两种方法如何工作的示例。
按位置联合
默认情况下,DuckDB 通过位置统一这些不同文件的列。这意味着每个文件的第一列被组合在一起,每个文件的第二列也被组合在一起,依此类推。例如,考虑以下两个文件。
FlightDate|UniqueCarrier|OriginCityName|DestCityName
1988-01-01|AA|New York, NY|Los Angeles, CA
1988-01-02|AA|New York, NY|Los Angeles, CA
FlightDate|UniqueCarrier|OriginCityName|DestCityName
1988-01-03|AA|New York, NY|Los Angeles, CA
同时读取这两个文件将产生以下结果集:
航班日期 | 唯一承运人 | 出发城市名称 | 目的地城市名称 |
---|---|---|---|
1988-01-01 | AA | 纽约, 纽约州 | 洛杉矶, 加利福尼亚州 |
1988-01-02 | AA | 纽约, 纽约州 | 洛杉矶, 加利福尼亚州 |
1988-01-03 | AA | 纽约, 纽约州 | 洛杉矶, 加利福尼亚州 |
这相当于SQL构造UNION ALL
。
按名称联合
如果您正在处理具有不同模式的多个文件,可能是因为添加或重命名了列,可能希望按名称统一不同文件的列。这可以通过提供union_by_name
选项来实现。例如,考虑以下两个文件,其中flights4.csv
有一个额外的列(UniqueCarrier
)。
FlightDate|OriginCityName|DestCityName
1988-01-01|New York, NY|Los Angeles, CA
1988-01-02|New York, NY|Los Angeles, CA
FlightDate|UniqueCarrier|OriginCityName|DestCityName
1988-01-03|AA|New York, NY|Los Angeles, CA
在统一列名时,如果按位置读取这些内容会导致错误——因为两个文件的列数不同。当指定union_by_name
选项时,列会正确统一,任何缺失的值都会设置为NULL
。
SELECT * FROM read_csv(['flights3.csv', 'flights4.csv'], union_by_name = true);
航班日期 | 出发城市名称 | 目的地城市名称 | 唯一承运人 |
---|---|---|---|
1988-01-01 | 纽约, 纽约州 | 洛杉矶, 加利福尼亚州 | NULL |
1988-01-02 | 纽约, 纽约州 | 洛杉矶, 加利福尼亚州 | NULL |
1988-01-03 | 纽约, 纽约州 | 洛杉矶, 加利福尼亚州 | AA |
这相当于SQL构造UNION ALL BY NAME
。
使用
union_by_name
选项会增加内存消耗。