Schemas kombinieren
Beispiele
CSV-Dateien lesen und Spalten nach Position kombinieren:
SELECT * FROM read_csv('flights*.csv');CSV-Dateien lesen und Spalten nach Name kombinieren:
SELECT * FROM read_csv('flights*.csv', union_by_name = true);Schemas kombinieren
Beim Lesen mehrerer Dateien müssen wir die Schemas dieser Dateien kombinieren. Jede Datei hat ein eigenes Schema, das sich von den anderen unterscheiden kann. DuckDB bietet zwei Wege, Schemas mehrerer Dateien zu vereinheitlichen: nach Spaltenposition und nach Spaltenname.
Standardmäßig liest DuckDB das Schema der ersten angegebenen Datei und vereinheitlicht die Spalten der folgenden Dateien nach Position. Das funktioniert korrekt, solange alle Dateien dasselbe Schema haben. Unterscheiden sich die Schemas der Dateien, können Sie die Option union_by_name nutzen, damit DuckDB das Schema anhand aller Namen aufbaut.
Im Folgenden ein Beispiel für beide Verfahren.
Union nach Position
Standardmäßig vereinheitlicht DuckDB die Spalten dieser verschiedenen Dateien nach Position. Das bedeutet, dass die erste Spalte jeder Datei zusammengeführt wird, ebenso die zweite Spalte jeder Datei usw. Betrachten Sie zum Beispiel die folgenden zwei Dateien.
FlightDate|UniqueCarrier|OriginCityName|DestCityName1988-01-01|AA|New York, NY|Los Angeles, CA1988-01-02|AA|New York, NY|Los Angeles, CAFlightDate|UniqueCarrier|OriginCityName|DestCityName1988-01-03|AA|New York, NY|Los Angeles, CADas gleichzeitige Lesen beider Dateien liefert folgendes Ergebnis:
| FlightDate | UniqueCarrier | OriginCityName | DestCityName |
|---|---|---|---|
| 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 |
Das entspricht dem SQL-Konstrukt UNION ALL.
Union nach Name
Wenn Sie mehrere Dateien mit unterschiedlichen Schemas verarbeiten, etwa weil Spalten hinzugekommen oder umbenannt wurden, kann es sinnvoll sein, die Spalten verschiedener Dateien nach Name zu vereinheitlichen. Das geht mit der Option union_by_name. Betrachten Sie zum Beispiel die folgenden zwei Dateien, wobei flights4.csv eine zusätzliche Spalte (UniqueCarrier) hat.
FlightDate|OriginCityName|DestCityName1988-01-01|New York, NY|Los Angeles, CA1988-01-02|New York, NY|Los Angeles, CAFlightDate|UniqueCarrier|OriginCityName|DestCityName1988-01-03|AA|New York, NY|Los Angeles, CADas Lesen bei Vereinheitlichung nach Position führt zu einem Fehler – die beiden Dateien haben unterschiedlich viele Spalten. Mit der Option union_by_name werden die Spalten korrekt vereinheitlicht, fehlende Werte werden auf NULL gesetzt.
SELECT * FROM read_csv(['flights3.csv', 'flights4.csv'], union_by_name = true);| FlightDate | OriginCityName | DestCityName | UniqueCarrier |
|---|---|---|---|
| 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 |
Das entspricht dem SQL-Konstrukt UNION ALL BY NAME.
Die Option
union_by_nameerhöht den Speicherverbrauch.