⌘+k ctrl+k
1.4 (LTS)
搜索快捷键 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 通过读取所有名称来构建架构。

以下是这两种方法如何工作的示例。

按位置合并 (Union by Position)

默认情况下,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)

如果您正在处理架构不同的多个文件(可能是因为添加或重命名了列),那么按名称统一不同文件的列可能更为理想。这可以通过提供 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 选项会增加内存消耗。

© 2025 DuckDB 基金会,阿姆斯特丹,荷兰
行为准则 商标使用指南