Variant-Typ
Der VARIANT-Typ speichert typisierte Binärdaten, bei denen jede Zeile selbstbeschreibend ist und ihre eigenen Typinformationen enthält. Das unterscheidet sich vom JSON-Typ, der physisch als Text gespeichert wird. Weil Typmetadaten pro Wert eingebettet sind, bietet VARIANT für semistrukturierte Daten bessere Kompression und Abfrageleistung als JSON.
Der VARIANT-Typ ist von Snowflakes semistrukturiertem VARIANT-Datentyp inspiriert. Er ist seit 2025 in Parquet verfügbar und wird auch vom Parquet-Reader von DuckDB unterstützt.
Beispiele
Verschiedene Typen in derselben Spalte speichern
Eine VARIANT-Spalte kann zeilenübergreifend Werte unterschiedlicher Typen aufnehmen:
CREATE TABLE events (id INTEGER, data VARIANT);INSERT INTO events VALUES (1, 42::VARIANT), (2, 'hello world'::VARIANT), (3, [1, 2, 3]::VARIANT), (4, {'name': 'Alice', 'age': 30}::VARIANT);
SELECT * FROM events;┌───────┬────────────────────────────┐│ id │ data ││ int32 │ variant │├───────┼────────────────────────────┤│ 1 │ 42 ││ 2 │ hello world ││ 3 │ [1, 2, 3] ││ 4 │ {'name': Alice, 'age': 30} │└───────┴────────────────────────────┘Den Typ eines Werts prüfen
Verwenden Sie variant_typeof, um den zugrunde liegenden Typ jeder Zeile zu prüfen:
SELECT id, data, variant_typeof(data) AS vtypeFROM events;┌───────┬────────────────────────────┬───────────────────┐│ id │ data │ vtype ││ int32 │ variant │ varchar │├───────┼────────────────────────────┼───────────────────┤│ 1 │ 42 │ INT32 ││ 2 │ hello world │ VARCHAR ││ 3 │ [1, 2, 3] │ ARRAY(3) ││ 4 │ {'name': Alice, 'age': 30} │ OBJECT(name, age) │└───────┴────────────────────────────┴───────────────────┘Felder aus verschachtelten Variants extrahieren
Felder können aus verschachtelten VARIANT-Werten mit Punkt-Notation oder der Funktion variant_extract extrahiert werden:
SELECT data.name FROM events WHERE id = 4;SELECT variant_extract(data, 'name') AS name FROM events WHERE id = 4;┌─────────┐│ name ││ variant │├─────────┤│ Alice │└─────────┘Parquet-Unterstützung
DuckDB unterstützt das Lesen und Schreiben von VARIANT-Typen aus Parquet-Dateien, einschließlich Shredding, einer Technik, die verschachtelte Daten als flache Werte speichert, um den Zugriff effizienter zu machen.
VARIANT nach Parquet schreiben
Beim Schreiben von VARIANT-Spalten nach Parquet kann DuckDB die Variant-Daten automatisch shredden (zerlegen) in typisierte Spalten auf Basis der Struktur der ersten Row Group. Dieses Auto-Shredding verbessert die Leseleistung durch Predicate Pushdown und effizienten Spaltenzugriff.
Um explizit ein Schema für das Shredding anzugeben, verwenden Sie die Copy-Option SHREDDING:
COPY events TO 'events.parquet' ( FORMAT parquet, SHREDDING {'data': 'STRUCT(name VARCHAR, age INTEGER)'});Snowflake-VARIANT aus Parquet lesen
DuckDB kann geshreddete VARIANT-Parquet-Dateien lesen, die von Snowflake erzeugt wurden, und rekonstruiert die Variant-Werte automatisch aus den geshreddeten Spalten.