Hoe verschilt variant dan JSON-tekenreeksen?

In dit artikel worden de gedragswijzigingen en verschillen in syntaxis en semantiek beschreven bij het werken met het gegevenstype variant. In dit artikel wordt ervan uitgegaan dat u bekend bent met het werken met JSON-tekenreeksgegevens in Azure Databricks. Voor gebruikers die niet bekend zijn met Azure Databricks, moet u variant op JSON-tekenreeksen gebruiken wanneer semi-gestructureerde gegevens worden opgeslagen waarvoor flexibiliteit is vereist voor het wijzigen of onbekende schema. Zie Semi-gestructureerde modelgegevens.

In Databricks Runtime 15.3 en hoger kunt u het gegevenstype variant gebruiken om semi-gestructureerde gegevens te coderen en op te vragen. Databricks raadt varianten aan als vervanging voor het opslaan van semi-gestructureerde gegevens met behulp van JSON-tekenreeksen. Dankzij de verbeterde lees- en schrijfprestaties van variant kan dit in sommige toepassingen native Spark-complextypen, zoals structs en arrays, vervangen.

Hoe voert u query's uit op variantgegevens?

Variantgegevens gebruiken dezelfde operators om query's uit te voeren op velden, subvelden en matrixelementen.

Als u een query wilt uitvoeren op een veld, gebruikt u :. Bijvoorbeeld: column_name:field_name.

Als u een query wilt uitvoeren op een subveld, gebruikt u .. Bijvoorbeeld: column_name:field_name.subfield_name.

Als u een query wilt uitvoeren op een matrixelement, gebruikt [n] u waar n de indexwaarde voor gehele getallen van het element is. Als u bijvoorbeeld een query wilt uitvoeren op de eerste waarde in een matrix, column_name:array_name[0].

De volgende verschillen kunnen bestaande query's verbreken bij het upgraden van JSON-tekenreeksen naar variant:

  • Alle variantpadelementen worden op een hoofdlettergevoelige manier vergeleken. JSON-tekenreeksen zijn niet hoofdlettergevoelig. Dit betekent dat voor variant column_name:FIELD_NAME en column_name:field_name zoek naar verschillende velden in de opgeslagen gegevens.
  • De [*] syntaxis biedt geen ondersteuning voor het identificeren of uitpakken van alle elementen in een matrix.
  • Variant codeert NULL waarden anders dan JSON-tekenreeksen. Zie Null-regels voor varianten.
  • Variantkolommen hebben beperkingen voor sommige bewerkingen. Zie Beperkingen.

JSON-tekenreeksen converteren naar en van variant

In Databricks Runtime 15.3 en hoger heeft de functie to_json extra functionaliteit om typen van VARIANT naar JSON-tekenreeksen te converteren. Opties worden genegeerd bij het VARIANT converteren naar JSON-tekenreeks. Zie to_json.

De parse_json functie transformeert een JSON-tekenreeks naar type met behulp van SQL of VARIANT. Hoewel parse_json(json_string_column) dit de logische inverse is to_json(variant_column), beschrijven de volgende conversieregels waarom dit niet de exacte inverse is:

  • Witruimte is niet perfect bewaard.
  • Volgorde van sleutels is willekeurig.
  • Volgnullen in getallen worden mogelijk afgekapt.

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()

De parse_json functie retourneert een fout als de JSON-tekenreeks ongeldig is, de limiet voor de variantgrootte overschrijdt of ongeldig is. Gebruik de try_parse_json functie (SQL of Python) om een NULL te retourneren wanneer er een fout optreedt bij het parseren.

SQL

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

Python

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

Wat zijn de SQL-functies voor het werken met varianten?

Apache Spark SQL-functies die beschikbaar zijn in Databricks Runtime 15.3 en hoger bieden methoden voor interactie met variantgegevens. De volgende tabel bevat de nieuwe functie, de bijbehorende JSON-tekenreeksfunctie en notities over verschillen in gedrag.

Varianten gaan anders om met casten en NULL dan JSON-strings. Zie regels voor typeconversie van varianttypen en null-regels voor varianten.

Notitie

Als u deze functies wilt gebruiken met PySpark DataFrames, importeert u ze uit pyspark.sql.functions.

Variant, functie JSON-tekenreeksfunctie Opmerkingen
variant_get cast en get_json_object Neemt een expressie, een pad en een type. Volgt alle regels voor variantpaden, typeconversies en nullwaarden.
try_variant_get try_cast en get_json_object Neemt een expressie, een pad en een type. Volgt alle regels voor variantpaden, typeconversies en nullwaarden.
is_variant_null is null Controleert of de expressie een met VARIANT gecodeerde NULL opslaat. Gebruik is null om te controleren of de invoerexpressie NULL is.
schema_of_variant schema_of_json Bij het bepalen van het schema voor een ARRAY<elementType>, kan elementType worden afgeleid als VARIANT als er conflicterende typen in de gegevens worden gevonden.
schema_of_variant_agg schema_of_json_agg Wanneer niet het minst gangbare type wordt geïdentificeerd, wordt het type afgeleid als VARIANT.
variant_explode ontploffen Geeft pos, key en value kolommen weer. Bij het exploderen van een array is de outputsleutel altijd null.
variant_explode_outer explode_outer Geeft pos, key en value kolommen weer. Bij het exploderen van een array is de outputsleutel altijd null.