Zum Inhalt springen

Dateien direkt lesen

DuckDB ermöglicht das direkte Lesen von Dateien über die Funktionen read_text und read_blob. Diese Funktionen akzeptieren einen Dateinamen, eine Liste von Dateinamen oder ein Glob-Muster. Sie geben den Inhalt jeder Datei als VARCHAR bzw. BLOB aus, zusammen mit Metadaten wie Dateigröße und Zeitpunkt der letzten Änderung.

read_text

Die Tabellenfunktion read_text liest aus der/den ausgewählten Quelle(n) in einen VARCHAR. Jede Datei ergibt eine Zeile, in der das Feld content den gesamten Inhalt der jeweiligen Datei enthält.

SELECT size, parse_path(filename), content
FROM read_text('test/sql/table_function/files/*.txt');
size parse_path(filename) content
12 [test, sql, table_function, files, one.txt] Hello World!
2 [test, sql, table_function, files, three.txt] 42
10 [test, sql, table_function, files, two.txt] Foo Bar\nFöö Bär

DuckDB prüft zuerst, ob der Dateiinhalt gültiges UTF-8 ist. Wenn read_text versucht, eine Datei mit ungültigem UTF-8 zu lesen, wirft DuckDB einen Fehler und schlägt vor, stattdessen read_blob zu verwenden.

read_text unterstützt auch das Lesen aus Pipes (z. B. /dev/stdin).

Die maximal zulässige Dateigröße für read_text beträgt 3,9 GiB.

read_blob

Die Tabellenfunktion read_blob liest aus der/den ausgewählten Quelle(n) in einen BLOB:

SELECT size, content, filename
FROM read_blob('test/sql/table_function/files/*');
size content filename
178 PK\x03\x04\x0A\x00\x00\x00\x00\x00\xACi=X\x14t\xCE\xC7\x0A… test/sql/table_function/files/four.blob
12 Hello World! test/sql/table_function/files/one.txt
2 42 test/sql/table_function/files/three.txt
10 F\xC3\xB6\xC3\xB6 B\xC3\xA4r test/sql/table_function/files/two.txt

Die maximal zulässige Dateigröße für read_blob beträgt 3,9 GiB.

Schema

Die Schemas der von read_text und read_blob zurückgegebenen Tabellen sind identisch:

DESCRIBE FROM read_text('README.md');
column_name column_type null key default extra
filename VARCHAR YES NULL NULL NULL
content VARCHAR YES NULL NULL NULL
size BIGINT YES NULL NULL NULL
last_modified TIMESTAMP YES NULL NULL NULL

Hive-Partitionierung

Daten können aus Hive-partitionierten Datensätzen gelesen werden.

SELECT *
FROM read_blob('data/parquet-testing/hive-partitioning/simple/**/*.parquet')
WHERE part IN ('a', 'b') AND date >= '2012-01-01';
filename content size last_modified date part
…/part=a/date=2012-01-01/test.parquet PAR1\x15\x00\x15\x14\x15\x18… 266 2024-11-12 02:23:20+00 2012-01-01 a
…/part=b/date=2013-01-01/test.parquet PAR1\x15\x00\x15\x14\x15\x18… 266 2024-11-12 02:23:20+00 2013-01-01 b

Fehlende Metadaten behandeln

Wenn das zugrunde liegende Dateisystem diese Daten nicht liefern kann (z. B. liefert HTTPFS nicht immer einen gültigen Zeitstempel), wird die Zelle stattdessen auf NULL gesetzt.

Unterstützung für Projection Pushdown

Diese Tabellenfunktionen nutzen außerdem Projection Pushdown, um Eigenschaften nicht unnötig zu berechnen. Sie können beispielsweise mit einem Glob-Muster ein Verzeichnis großer Dateien einlesen, um die Dateigrößen in der Spalte size zu erhalten. Solange Sie die Spalte content weglassen, liest DuckDB die Dateidaten nicht.