⌘+k ctrl+k
1.1.3 (stable)
Search Shortcut cmd + k | ctrl + k
Combining Schemas

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 通过位置统一这些不同文件的列。这意味着每个文件的第一列被组合在一起,每个文件的第二列也被组合在一起,依此类推。例如,考虑以下两个文件。

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 纽约, 纽约州 洛杉矶, 加利福尼亚州
1988-01-02 AA 纽约, 纽约州 洛杉矶, 加利福尼亚州
1988-01-03 AA 纽约, 纽约州 洛杉矶, 加利福尼亚州

这相当于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 纽约, 纽约州 洛杉矶, 加利福尼亚州 NULL
1988-01-02 纽约, 纽约州 洛杉矶, 加利福尼亚州 NULL
1988-01-03 纽约, 纽约州 洛杉矶, 加利福尼亚州 AA

这相当于SQL构造UNION ALL BY NAME

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