⌘+k ctrl+k
1.3 (稳定版)
搜索快捷键 cmd + k | ctrl + k
合并模式

示例

读取一组 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 按位置统一这些不同文件的列。这意味着每个文件中的第一列会合并在一起,每个文件中的第二列也如此,以此类推。例如,请看以下两个文件。

flights1.csv:

FlightDate|UniqueCarrier|OriginCityName|DestCityName
1988-01-01|AA|New York, NY|Los Angeles, CA
1988-01-02|AA|New York, NY|Los Angeles, CA

flights2.csv:

FlightDate|UniqueCarrier|OriginCityName|DestCityName
1988-01-03|AA|New York, NY|Los Angeles, CA

同时读取这两个文件将生成以下结果集

航班日期 唯一承运人 出发城市名称 目的城市名称
1988-01-01 AA New York, NY Los Angeles, CA
1988-01-02 AA New York, NY Los Angeles, CA
1988-01-03 AA New York, NY Los Angeles, CA

这等同于 SQL 构造 UNION ALL

按名称合并

如果您正在处理具有不同模式的多个文件(可能是因为添加或重命名了列),那么最好按名称统一不同文件的列。这可以通过提供 union_by_name 选项来完成。例如,请看以下两个文件,其中 flights4.csv 有一个额外的列(UniqueCarrier)。

flights3.csv:

FlightDate|OriginCityName|DestCityName
1988-01-01|New York, NY|Los Angeles, CA
1988-01-02|New York, NY|Los Angeles, CA

flights4.csv:

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 New York, NY Los Angeles, CA NULL
1988-01-02 New York, NY Los Angeles, CA NULL
1988-01-03 New York, NY Los Angeles, CA AA

这等同于 SQL 构造 UNION ALL BY NAME

使用 union_by_name 选项会增加内存消耗。