Zum Inhalt springen

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 vtype
FROM 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.