Hoe verschilt variant dan JSON-tekenreeksen?
Belangrijk
Deze functie is beschikbaar als openbare preview.
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 nieuwe gebruikers van Azure Databricks zou je variant in plaats van JSON-tekenreeksen gebruiken wanneer semi-gestructureerde gegevens worden opgeslagen waarvoor flexibiliteit is vereist bij veranderende 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 voor varianten kan het systeemeigen Spark-complexe typen, zoals structs en matrices, in sommige gebruiksscenario's 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 u [n]
wherewaarbijn
de gehele indexwaarde 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 hoofdlettergevoelig. Dit betekent dat voor variant
column_name:FIELD_NAME
encolumn_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
values anders dan JSON-tekenreeksen. Zie Null-regels voor varianten. - Variant columns heeft beperkingen voor sommige bewerkingen. Zie Beperkingen.
JSON-tekenreeksen converteren naar en van variant
In Databricks Runtime 15.3 en hoger heeft de to_json
functie extra functionaliteit om typen naar JSON-tekenreeksen te casten VARIANT
. Opties worden genegeerd bij het VARIANT
converteren naar JSON-tekenreeks. Zie to_json.
De parse_json
functie transformeert een JSON-tekenreeks die moet worden VARIANT
getypt. 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.
De functie parse_json
retourneert een fout als de JSON-tekenreeks ongeldig is of groter is dan de variantgrootte limit. Gebruik de try_parse_json
functie om in plaats daarvan een NULL
fout bij parseren te retourneren.
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 table bevat de nieuwe functie, de bijbehorende JSON-tekenreeksfunctie en notities over verschillen in gedrag.
Notitie
Als u deze functies wilt gebruiken met PySpark DataFrames, importeert u ze uit pyspark.sql.functions
.
variant_explode
en variant_explode_outer
worden niet ondersteund in PySpark.
Variant, functie | JSON-tekenreeksfunctie | Opmerkingen |
---|---|---|
variant_get | cast en get_json_object | Neemt een expressie, pad en type. Volgt alle regels voor variantenpaden, cast-conversie en null-waarden. |
try_variant_get | try_cast en get_json_object | Neemt een expressie, pad en type. Volgt alle regels voor variantenpaden, cast-conversie en null-waarden. |
is_variant_null | is null | Hiermee wordt gecontroleerd of de expressie een VARIANT gecodeerde NULL opslaat. Gebruik is null dit om te controleren of de invoerexpressie is NULL . |
schema_of_variant | schema_of_json | Bij het bepalen van de schema voor een ARRAY<elementType> , kan de elementType worden afgeleid als VARIANT als er conflicterende typen in de gegevens zijn 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 | Voert pos , key en value columnsuit. Bij het uitploten van een matrix is de uitvoersleutel altijd null. |
variant_explode_outer | explode_outer | Voert pos , key en value columnsuit. Bij het uitploten van een matrix is de uitvoersleutel altijd null. |
Varianten verwerken casten en NULL
verschillen van JSON-tekenreeksen. Zie Cast-regels voor varianttypen en null-regels voor varianten.