Zum Inhalt springen

Mehrere Dateien lesen

DuckDB kann mehrere Dateien verschiedener Typen (CSV, Parquet, JSON) gleichzeitig lesen, entweder mit Glob-Syntax oder durch Angabe einer Dateiliste. Tipps zum Lesen von Dateien mit unterschiedlichen Schemas finden Sie auf der Seite Schemas kombinieren.

CSV

Alle Dateien mit der Endung .csv im Ordner dir lesen:

SELECT *
FROM 'dir/*.csv';

Alle Dateien mit der Endung .csv zwei Verzeichnisebenen tief lesen:

SELECT *
FROM '*/*/*.csv';

Alle Dateien mit der Endung .csv in beliebiger Tiefe im Ordner dir lesen:

SELECT *
FROM 'dir/**/*.csv';

Die CSV-Dateien flights1.csv und flights2.csv lesen:

SELECT *
FROM read_csv(['flights1.csv', 'flights2.csv']);

Die CSV-Dateien flights1.csv und flights2.csv lesen, Schemas nach Name vereinheitlichen und eine Spalte filename ausgeben:

SELECT *
FROM read_csv(['flights1.csv', 'flights2.csv'], union_by_name = true, filename = true);

Parquet

Alle Dateien lesen, die dem Glob-Muster entsprechen:

SELECT *
FROM 'test/*.parquet';

Drei Parquet-Dateien lesen und als eine Tabelle behandeln:

SELECT *
FROM read_parquet(['file1.parquet', 'file2.parquet', 'file3.parquet']);

Alle Parquet-Dateien aus zwei bestimmten Ordnern lesen:

SELECT *
FROM read_parquet(['folder1/*.parquet', 'folder2/*.parquet']);

Alle Parquet-Dateien lesen, die dem Glob-Muster in beliebiger Tiefe entsprechen:

SELECT *
FROM read_parquet('dir/**/*.parquet');

Mehrere Dateien und Globs

DuckDB kann auch eine Reihe von Parquet-Dateien lesen und sie wie eine einzige Tabelle behandeln. Das funktioniert nur, wenn die Parquet-Dateien dasselbe Schema haben. Welche Parquet-Dateien gelesen werden, geben Sie über einen Listenparameter, Glob-Muster oder eine Kombination aus beidem an.

Listenparameter

Die Funktion read_parquet kann eine Liste von Dateinamen als Eingabeparameter entgegennehmen.

Drei Parquet-Dateien lesen und als eine Tabelle behandeln:

SELECT *
FROM read_parquet(['file1.parquet', 'file2.parquet', 'file3.parquet']);

Glob-Syntax

Jeder Dateiname, der an read_parquet übergeben wird, kann ein genauer Dateiname sein oder Glob-Syntax verwenden, um mehrere Dateien zu lesen, die einem Muster entsprechen.

Platzhalter Beschreibung
* Entspricht beliebig vielen beliebigen Zeichen (einschließlich keinem)
** Entspricht beliebig vielen Unterverzeichnissen (einschließlich keinem)
? Entspricht einem einzelnen Zeichen
[abc] Entspricht einem der Zeichen in den Klammern
[a-z] Entspricht einem Zeichen aus dem Bereich in den Klammern

Beachten Sie, dass der Platzhalter ? in Globs beim Lesen über S3 wegen HTTP-Kodierungsproblemen nicht unterstützt wird.

Hier ein Beispiel, das alle Dateien mit der Endung .parquet im Ordner test liest:

Alle Dateien lesen, die dem Glob-Muster entsprechen:

SELECT *
FROM read_parquet('test/*.parquet');

Liste von Globs

Glob-Syntax und Listenparameter können kombiniert werden, um Dateien zu scannen, die eines von mehreren Mustern erfüllen.

Alle Parquet-Dateien aus 2 bestimmten Ordnern lesen.

SELECT *
FROM read_parquet(['folder1/*.parquet', 'folder2/*.parquet']);

DuckDB kann mehrere CSV-Dateien gleichzeitig lesen, entweder mit Glob-Syntax oder durch Angabe einer Dateiliste.

Dateiname

Mit dem Argument filename kann eine zusätzliche Spalte filename ergänzt werden, die angibt, aus welcher Datei eine Zeile stammt. Zum Beispiel:

SELECT *
FROM read_csv(['flights1.csv', 'flights2.csv'], union_by_name = true, filename = true);
FlightDate OriginCityName DestCityName UniqueCarrier filename
1988-01-01 New York, NY Los Angeles, CA NULL flights1.csv
1988-01-02 New York, NY Los Angeles, CA NULL flights1.csv
1988-01-03 New York, NY Los Angeles, CA AA flights2.csv

Das Argument filename akzeptiert auch eine Zeichenkette (z. B. filename = 'input_file'). Diese wird dann als Name der hinzugefügten Spalte verwendet. Das ist nützlich, wenn die Quelldaten bereits eine Spalte filename enthalten und Sie eine Namenskollision vermeiden möchten.

Glob-Funktion zum Finden von Dateinamen

Die Glob-Muster können auch mit der Tabellenfunktion glob zum Suchen von Dateinamen verwendet werden. Sie nimmt einen Parameter entgegen: den Suchpfad (der Glob-Muster enthalten darf).

Das aktuelle Verzeichnis nach allen Dateien durchsuchen.

SELECT *
FROM glob('*');
file
test.csv
test.json
test.parquet
test2.csv
test2.parquet
todos.json