Partitioniertes Schreiben
Beispiele
Eine Tabelle in einen Hive-partitionierten Datensatz aus Parquet-Dateien schreiben:
COPY orders TO 'orders'(FORMAT parquet, PARTITION_BY (year, month));Eine Tabelle in einen Hive-partitionierten Datensatz aus CSV-Dateien schreiben und Überschreiben erlauben:
COPY orders TO 'orders'(FORMAT csv, PARTITION_BY (year, month), OVERWRITE_OR_IGNORE);Eine Tabelle in einen Hive-partitionierten Datensatz aus GZIP-komprimierten CSV-Dateien schreiben und die Dateiendung der Datendateien explizit setzen:
COPY orders TO 'orders'(FORMAT csv, PARTITION_BY (year, month), COMPRESSION gzip, FILE_EXTENSION 'csv.gz');Partitioniertes Schreiben
Wenn die Klausel PARTITION_BY für die COPY-Anweisung angegeben ist, werden die Dateien in einer Hive-partitionierten Ordnerhierarchie geschrieben. Das Ziel ist der Name des Wurzelverzeichnisses (im Beispiel oben: orders). Die Dateien werden in der Dateihierarchie der Reihe nach geschrieben. Derzeit schreibt jeder Thread eine Datei in jedes Verzeichnis.
orders├── year=2021│ ├── month=1│ │ ├── data_1.parquet│ │ └── data_2.parquet│ └── month=2│ └── data_1.parquet└── year=2022 ├── month=11 │ ├── data_1.parquet │ └── data_2.parquet └── month=12 └── data_1.parquetDie Werte der Partitionen werden automatisch aus den Daten extrahiert. Beachten Sie, dass das Schreiben einer größeren Anzahl von Partitionen sehr teuer sein kann, weil viele Dateien entstehen. Die ideale Partitionsanzahl hängt von der Größe Ihres Datensatzes ab.
Um die maximale Anzahl gleichzeitig offener Dateien zu begrenzen, die das System beim Schreiben mit PARTITION_BY halten kann, bevor es auf die Platte schreibt, verwenden Sie die Konfigurationsoption partitioned_write_max_open_files (Standard: 100):
SET partitioned_write_max_open_files = 10;Bestpractice Das Schreiben in viele kleine Partitionen ist teuer. Empfohlen sind in der Regel mindestens
100 MBDaten pro Partition.
Dateinamensmuster
Standardmäßig heißen Dateien data_0.parquet oder data_0.csv. Mit dem Flag FILENAME_PATTERN lässt sich ein Muster mit {i} oder {uuid} festlegen, um bestimmte Dateinamen zu erzeugen:
{i}wird durch einen Index ersetzt.{uuid}wird durch eine 128 Bit lange UUID ersetzt.
Eine Tabelle in einen Hive-partitionierten Datensatz aus .parquet-Dateien mit einem Index im Dateinamen schreiben:
COPY orders TO 'orders'(FORMAT parquet, PARTITION_BY (year, month), OVERWRITE_OR_IGNORE, FILENAME_PATTERN 'orders_{i}');Eine Tabelle in einen Hive-partitionierten Datensatz aus .parquet-Dateien mit eindeutigen Dateinamen schreiben:
COPY orders TO 'orders'(FORMAT parquet, PARTITION_BY (year, month), OVERWRITE_OR_IGNORE, FILENAME_PATTERN 'file_{uuid}');Überschreiben
Standardmäßig erlaubt das partitionierte Schreiben kein Überschreiben bestehender Verzeichnisse.
Auf einem lokalen Dateisystem entfernen die Optionen OVERWRITE und OVERWRITE_OR_IGNORE die bestehenden Verzeichnisse.
Auf entfernten Dateisystemen wird Überschreiben nicht unterstützt.
Anhängen
Um an eine bestehende Hive-partitionierte Verzeichnisstruktur anzuhängen, verwenden Sie die Option APPEND:
COPY orders TO 'orders'(FORMAT parquet, PARTITION_BY (year, month), APPEND);Die Option APPEND verhält sich ähnlich wie die Optionen OVERWRITE_OR_IGNORE, FILENAME_PATTERN '{uuid}',
DuckDB prüft jedoch zusätzlich, ob die Datei bereits existiert, und erzeugt in dem seltenen Fall, dass sie existiert, die UUID neu (um Kollisionen zu vermeiden).
Schrägstriche in Spalten behandeln
Um Schrägstriche in Spaltennamen zu behandeln, verwenden Sie die Percent-Encoding-Kodierung der Funktion url_encode.