Freigeben über


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 und column_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.
  • Variant-Spalten weisen Einschränkungen für einige Vorgänge auf. Informationen finden Sie unter Einschränkungen.

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 (SQL oder Python) wandelt eine JSON-Zeichenfolge in den VARIANT Typ um. 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.

SQL

SELECT parse_json('{"key": 1, "data": [2, 3, "str"]}');

Python

spark.range(1).select(parse_json(lit('{"key": 1, "data": [2, 3, "str"]}'))).display()

Die parse_json Funktion gibt einen Fehler zurück, wenn die JSON-Zeichenfolge falsch formatiert ist, die Größenbeschränkung der Variante überschreitet oder ungültig ist. Verwenden Sie die try_parse_json Funktion (SQL oder Python), um stattdessen ein NULL zurückzugeben, wenn ein Fehler bei der Analyse auftritt.

SQL

SELECT try_parse_json('{"a" : invalid, "b" : 2}');

Python

spark.range(1).select(try_parse_json(lit('{"a" : invalid, "b" : 2}'))).display()

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.

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.

Hinweis

Um diese Funktionen mit PySpark-DataFrames zu verwenden, importieren Sie sie aus pyspark.sql.functions.

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 ist 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.