Zum Inhalt springen

Hive-Partitionierung

Beispiele

Daten aus einem Hive-partitionierten Datensatz lesen:

SELECT *
FROM read_parquet('orders/*/*/*.parquet', hive_partitioning = true);

Eine Tabelle in einen Hive-partitionierten Datensatz schreiben:

COPY orders
TO 'orders' (FORMAT parquet, PARTITION_BY (year, month));

Beachten Sie, dass die Optionen von PARTITION_BY keine Ausdrücke verwenden können. Spalten können Sie zur Laufzeit mit der folgenden Syntax erzeugen:

COPY (SELECT *, year(timestamp) AS year, month(timestamp) AS month FROM services)
TO 'test' (PARTITION_BY (year, month));

Beim Lesen werden die Partitionsspalten aus der Verzeichnisstruktur gelesen und können je nach Parameter hive_partitioning einbezogen oder ausgeschlossen werden.

FROM read_parquet('test/*/*/*.parquet', hive_partitioning = false); -- will not include year, month columns
FROM read_parquet('test/*/*/*.parquet', hive_partitioning = true); -- will include year, month partition columns

Hive-Partitionierung

Hive-Partitionierung ist eine Partitionierungsstrategie, mit der eine Tabelle anhand von Partitionsschlüsseln in mehrere Dateien aufgeteilt wird. Die Dateien liegen in Ordnern. Innerhalb jedes Ordners hat der Partitionsschlüssel einen Wert, der sich aus dem Ordnernamen ergibt.

Unten ein Beispiel einer Hive-partitionierten Dateihierarchie. Die Dateien sind nach zwei Schlüsseln (year und month) partitioniert.

orders
├── year=2021
│ ├── month=1
│ │ ├── file1.parquet
│ │ └── file2.parquet
│ └── month=2
│ └── file3.parquet
└── year=2022
├── month=11
│ ├── file4.parquet
│ └── file5.parquet
└── month=12
└── file6.parquet

Dateien in dieser Hierarchie lassen sich mit dem Flag hive_partitioning lesen.

SELECT *
FROM read_parquet('orders/*/*/*.parquet', hive_partitioning = true);

Wenn wir das Flag hive_partitioning setzen, werden die Spaltenwerte aus den Verzeichnissen gelesen.

Filter-Pushdown

Filter auf die Partitionsschlüssel werden automatisch in die Dateien geschoben. So überspringt das System Dateien, die für die Beantwortung einer Abfrage nicht nötig sind. Betrachten Sie zum Beispiel die folgende Abfrage auf dem obigen Datensatz:

SELECT *
FROM read_parquet('orders/*/*/*.parquet', hive_partitioning = true)
WHERE year = 2022
AND month = 11;

Bei der Ausführung dieser Abfrage werden nur die folgenden Dateien gelesen:

orders
└── year=2022
└── month=11
├── file4.parquet
└── file5.parquet

Automatische Erkennung

Standardmäßig versucht das System zu erkennen, ob die angegebenen Dateien in einer Hive-partitionierten Hierarchie liegen. Ist das der Fall, wird das Flag hive_partitioning automatisch aktiviert. Die automatische Erkennung betrachtet die Ordnernamen und sucht nach einem Muster 'key' = 'value'. Dieses Verhalten lässt sich mit der Konfigurationsoption hive_partitioning überschreiben:

SET hive_partitioning = false;

Hive-Typen

hive_types legt die logischen Typen der Hive-Partitionen in einem Struct fest:

SELECT *
FROM read_parquet(
'dir/**/*.parquet',
hive_partitioning = true,
hive_types = {'release': DATE, 'orders': BIGINT}
);

hive_types wird für die folgenden Typen automatisch erkannt: DATE, TIMESTAMP und BIGINT. Um die automatische Erkennung auszuschalten, kann das Flag hive_types_autocast = 0 gesetzt werden.

Partitionierte Dateien schreiben

Siehe den Abschnitt Partitioniertes Schreiben.