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), contentFROM 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_textbeträgt 3,9 GiB.
read_blob
Die Tabellenfunktion read_blob liest aus der/den ausgewählten Quelle(n) in einen BLOB:
SELECT size, content, filenameFROM 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_blobbeträ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.