Wie unterscheidet sich der Variant-Datentyp von JSON-Zeichenfolgen?
Wichtig
Dieses Feature befindet sich in der Public Preview.
In diesem Artikel werden die Verhaltensänderungen und Unterschiede bei der Syntax und Semantik beim Arbeiten mit dem Variant-Datentyp beschrieben. In diesem Artikel wird davon ausgegangen, dass Sie mit der Arbeit mit JSON-Zeichenfolgendaten in Azure Databricks vertraut sind. Für Benutzer:innen, die noch nicht mit Azure Databricks arbeiten, sollten Sie bei der Speicherung halbstrukturierter Daten, die Flexibilität beim Ändern oder unbekannten Schema erfordern, anstelle von JSON-Zeichenfolgen den Variant-Datentyp verwenden. Weitere Informationen finden Sie unter Modellieren teilweise strukturierter Daten.
In Databricks Runtime 15.3 und höher können Sie den Variant-Datentyp verwenden, um teilweise strukturierte Daten zu codieren und abzufragen. Databricks empfiehlt den Variant-Datentyp als Ersatz zum Speichern teilweise strukturierter Daten mithilfe von JSON-Zeichenfolgen. Die verbesserte Lese- und Schreibleistung beim Variant-Datentyp ermöglicht es, native komplexe Spark-Typen wie Strukturen und Arrays in einigen Anwendungsfällen zu ersetzen.
Wie fragen Sie Variant-Daten ab?
Variant-Daten verwenden dieselben Operatoren zum Abfragen von Feldern, Unterfeldern und Arrayelementen.
Verwenden Sie :
, um ein Feld abzufragen. Beispiel: column_name:field_name
.
Verwenden Sie .
, um ein Unterfeld abzufragen. Beispiel: column_name:field_name.subfield_name
.
Verwenden Sie [n]
, um ein Arrayelement abzufragen, wobei n
ganzzahlige Indexwert des Elements ist. Um z. B. den ersten Wert in einem Array abzufragen, verwenden Sie column_name:array_name[0]
.
Die folgenden Unterschiede können beim Upgrade von JSON-Zeichenfolgen auf den Variant-Datentyp zu einer Unterbrechung bei vorhandenen Abfragen führen:
- Alle Variant-Pfadelemente werden unter Berücksichtigung der Groß-/Kleinschreibung verglichen. Bei JSON-Zeichenfolgen wird die Groß-/Kleinschreibung nicht beachtet. Dies bedeutet, dass beim Variant-Datentyp
column_name:FIELD_NAME
undcolumn_name:field_name
nach verschiedenen Feldern in den gespeicherten Daten suchen. - Die
[*]
-Syntax wird nicht unterstützt, um alle Elemente in einem Array zu identifizieren oder zu entpacken. - Beim Variant-Datentyp werden
NULL
-Werte anders als JSON-Zeichenfolgen codiert. Weitere Informationen finden Sie unter NULL-Regeln beim Variant-Datentyp.
Konvertieren zwischen JSON-Zeichenfolge und Variant-Datentyp
In Databricks Runtime 15.3 und höher verfügt die to_json
-Funktion über zusätzliche Funktionen zum Umwandeln von VARIANT
-Typen in JSON-Zeichenfolgen. Optionen werden beim Konvertieren von VARIANT
in JSON-Zeichenfolgen ignoriert. Weitere Informationen finden Sie unter to_json.
Die parse_json
-Funktion transformiert eine JSON-Zeichenfolge in den Typ VARIANT
. parse_json(json_string_column)
ist zwar die logische Umkehrung von to_json(variant_column)
, die folgenden Konvertierungsregeln zeigen jedoch, warum es keine genau Inversion ist:
- Leerräume bleiben nicht perfekt erhalten.
- Die Sortierung von Schlüsseln ist beliebig.
- Nullen am Ende von Zahlen werden möglicherweise abgeschnitten.
Die parse_json
-Funktion gibt einen Fehler zurück, wenn die JSON-Zeichenfolge falsch formatiert ist oder die Größenbeschränkung für den Variant-Datentyp überschreitet. Verwenden Sie die try_parse_json
-Funktion, um stattdessen NULL
zurückzugeben, wenn bei der Analyse ein Fehler auftritt.
Welche SQL-Funktionen sind für die Arbeit mit dem Variant-Datentyp verfügbar?
Apache Spark SQL-Funktionen, die in Databricks Runtime 15.3 und höher verfügbar sind, bieten Methoden für die Interaktion mit Variant-Daten. Die folgende Tabelle enthält die neue Funktion, die entsprechende JSON-Zeichenfolgenfunktion und Anmerkungen zu Unterschieden im Verhalten.
Hinweis
Um diese Funktionen mit PySpark-DataFrames zu verwenden, importieren Sie sie aus pyspark.sql.functions
. variant_explode
und variant_explode_outer
werden in PySpark nicht unterstützt.
Variant-Funktion | JSON-Zeichenfolgenfunktion | Hinweise |
---|---|---|
variant_get | cast und get_json_object | Akzeptiert einen Ausdruck, Pfad und Typ. Folgt allen Regeln für Variant-Pfade, Umwandlungen und NULL-Werte. |
try_variant_get | try_cast und get_json_object | Akzeptiert einen Ausdruck, Pfad und Typ. Folgt allen Regeln für Variant-Pfade, Umwandlungen und NULL-Werte. |
is_variant_null | is null | Überprüft, ob der Ausdruck eine als VARIANT codierte NULL speichert. Verwenden Sie is null , um zu überprüfen, ob der Eingabeausdruck NULL ist. |
schema_of_variant | schema_of_json | Bei der Bestimmung des Schemas für eine ARRAY<elementType> wird elementType möglicherweise als VARIANT abgeleitet, wenn in den Daten in Konflikt stehende Typen enthalten sind. |
schema_of_variant_agg | schema_of_json_agg | Wenn kein Mindesttyp angegeben ist, wird als Typ VARIANT abgeleitet. |
variant_explode | explode | Gibt die Spalten pos , key und value aus. Beim Explodieren eines Arrays ist der Ausgabeschlüssel immer NULL. |
variant_explode_outer | explode_outer | Gibt die Spalten pos , key und value aus. Beim Explodieren eines Arrays ist der Ausgabeschlüssel immer NULL. |
Beim Variant-Datentyp werden Umwandlungen und NULL
anders als JSON-Zeichenfolgen behandelt. Weitere Informationen finden Sie unter Umwandlungsregeln für den Variant-Datentyp und NULL-Regeln beim Variant-Datentyp.