Query's uitvoeren op variantgegevens
Belangrijk
Deze functie is beschikbaar als openbare preview.
In dit artikel worden de Databricks SQL-operators beschreven die u kunt gebruiken om semi-gestructureerde gegevens op te vragen en te transformeren die zijn opgeslagen als VARIANT
. Het VARIANT
gegevenstype is beschikbaar in Databricks Runtime 15.3 en hoger.
Databricks raadt aan om JSON-tekenreeksen te gebruiken VARIANT
. Zie Hoe verschilt de variant van JSON-tekenreeksen die momenteel worden gemigreerd voor gebruikers die JSON-tekenreeksen willen migreren.
Als u voorbeelden wilt zien voor het uitvoeren van query's op semi-gestructureerde gegevens die zijn opgeslagen met JSON-tekenreeksen, raadpleegt u Query-JSON-tekenreeksen.
Notitie
VARIANT
columns kan niet worden gebruikt voor clustersleutels, partities of Z-ordersleutels. Het VARIANT
gegevenstype kan niet worden gebruikt voor vergelijkingen, groepering, volgorde en set bewerkingen. Voor een volledige list van beperkingen, zie Beperkingen.
Een table maken met een variant column
Voer de volgende query uit om een table te maken met zeer geneste gegevens die zijn opgeslagen als VARIANT
. De voorbeelden in dit artikel verwijzen allemaal naar deze table.
CREATE TABLE store_data AS
SELECT parse_json(
'{
"store":{
"fruit": [
{"weight":8,"type":"apple"},
{"weight":9,"type":"pear"}
],
"basket":[
[1,2,{"b":"y","a":"x"}],
[3,4],
[5,6]
],
"book":[
{
"author":"Nigel Rees",
"title":"Sayings of the Century",
"category":"reference",
"price":8.95
},
{
"author":"Herman Melville",
"title":"Moby Dick",
"category":"fiction",
"price":8.99,
"isbn":"0-553-21311-3"
},
{
"author":"J. R. R. Tolkien",
"title":"The Lord of the Rings",
"category":"fiction",
"reader":[
{"age":25,"name":"bob"},
{"age":26,"name":"jack"}
],
"price":22.99,
"isbn":"0-395-19395-8"
}
],
"bicycle":{
"price":19.95,
"color":"red"
}
},
"owner":"amy",
"zip code":"94025",
"fb:testid":"1234"
}'
) as raw
Queryvelden in een variant column
De syntaxis voor het opvragen van JSON-tekenreeksen en andere complexe gegevenstypen in Azure Databricks is van toepassing op VARIANT
gegevens, waaronder de volgende:
- Gebruik velden op het hoogste niveau van
:
tot select. - Gebruik
.
of[<key>]
om geneste velden met benoemde sleutels te manipuleren select. - Gebruik
[<index>]
om selectvalues uit matrices te selectvalues.
Notitie
Als een veldnaam een punt.
() bevat, moet u deze escapen met vierkante haken ([ ]
). Met de volgende query selecteert u bijvoorbeeld een veld met de naam zip.code
:
SELECT raw:['zip.code'] FROM store_data
Een variantveld op het hoogste niveau extraheren
Als u een veld wilt extraheren, geeft u de naam op van het JSON-veld in het extractiepad. Veldnamen zijn altijd hoofdlettergevoelig.
SELECT raw:owner FROM store_data
+-------+
| owner |
+-------+
| "amy" |
+-------+
-- Use backticks to escape special characters.
SELECT raw:`zip code`, raw:`fb:testid` FROM store_data
+----------+-----------+
| zip code | fb:testid |
+----------+-----------+
| "94025" | "1234" |
+----------+-----------+
Als een pad niet kan worden gevonden, is NULL
het resultaat van het type VARIANT
.
Geneste variantvelden extraheren
U geeft geneste velden op via punt notatie of met vierkante haken. Veldnamen zijn altijd hoofdlettergevoelig.
-- Use dot notation
SELECT raw:store.bicycle FROM store_data
+------------------+
| bicycle |
+------------------+
| { |
| "color":"red", |
| "price":19.95 |
| } |
+------------------+
-- Use brackets
SELECT raw:store['bicycle'] FROM store_data
+------------------+
| bicycle |
+------------------+
| { |
| "color":"red", |
| "price":19.95 |
| } |
+------------------+
Als een pad niet kan worden gevonden, is NULL
het resultaat van het type VARIANT
.
values extraheren uit variantenmatrices
U indexeert elementen in matrices met vierkante haken. Indexen zijn gebaseerd op 0.
-- Index elements
SELECT raw:store.fruit[0], raw:store.fruit[1] FROM store_data
+-------------------+------------------+
| fruit | fruit |
+-------------------+------------------+
| { | { |
| "type":"apple", | "type":"pear", |
| "weight":8 | "weight":9 |
| } | } |
+-------------------+------------------+
Als het pad niet kan worden gevonden of als de matrixindex buiten de grenzen valt, is NULL
het resultaat.
Afgevlakte variantobjecten en matrices
De functie variant_explode
table-valued generator kan worden gebruikt om VARIANT
matrices en objecten plat te maken.
Omdat variant_explode
een generatorfunctie is, gebruikt u deze als onderdeel van de FROM
component in plaats van in de SELECT
list, zoals in de volgende voorbeelden:
SELECT key, value
FROM store_data,
LATERAL variant_explode(store_data.raw:store);
+-------+--------------------+
| key| value|
+-------+--------------------+
| basket|[[1,2,{"a":"x","b...|
|bicycle|{"color":"red","p...|
| book|[{"author":"Nigel...|
| fruit|[{"type":"apple",...|
+-------+--------------------+
SELECT pos, value
FROM store_data,
LATERAL variant_explode(store_data.raw:store.basket[0]);
+---+-----------------+
|pos| value|
+---+-----------------+
| 0| 1|
| 1| 2|
| 2|{"a":"x","b":"y"}|
+---+-----------------+
Cast-regels voor varianttypen
U kunt matrices en scalaire waarden opslaan met behulp van VARIANT
het type. Wanneer u varianttypen probeert te casten naar andere typen, zijn normale cast-regels van toepassing op afzonderlijke values en velden, met de volgende aanvullende regels.
Notitie
variant_get
en try_variant_get
neem de typeargumenten en volg deze cast-regels.
Brontype | Gedrag |
---|---|
VOID |
Het resultaat is een van het NULL type VARIANT . |
ARRAY<elementType> |
Het elementType moet een type zijn dat kan worden gecast naar VARIANT . |
Wanneer u het type met schema_of_variant
of schema_of_variant_agg
als uitstel opgeeft, vallen functies terug op VARIANT
type in plaats STRING
van type wanneer er conflicterende typen aanwezig zijn die niet kunnen worden opgelost.
U kunt ::
of cast
gebruiken om values te casten naar ondersteunde gegevenstypen.
-- price is returned as a double, not a string
SELECT raw:store.bicycle.price::double FROM store_data
+------------------+
| price |
+------------------+
| 19.95 |
+------------------+
-- cast into more complex types
SELECT cast(raw:store.bicycle AS STRUCT<price DOUBLE, color STRING>) bicycle FROM store_data;
-- `::` also supported
SELECT raw:store.bicycle::STRUCT<price DOUBLE, color STRING> bicycle FROM store_data;
+------------------+
| bicycle |
+------------------+
| { |
| "price":19.95, |
| "color":"red" |
| } |
+------------------+
Null-regels voor varianten
Varianten kunnen twee soorten null-waarden bevatten:
-
SQL
NULL
: SQLNULL
s geven aan dat de waarde ontbreekt. Dit zijn dezelfdeNULL
als bij het omgaan met gestructureerde gegevens. -
Variant: Variant
NULL
NULL
s geven aan dat de variant expliciet eenNULL
waarde bevat. Deze zijn niet hetzelfde als SQLNULL
s, omdat deNULL
waarde wordt opgeslagen in de gegevens.
Gebruik de is_variant_null
functie om te bepalen of de variantwaarde een variant NULL
is.
SELECT
is_variant_null(parse_json(NULL)) AS sql_null,
is_variant_null(parse_json('null')) AS variant_null,
is_variant_null(parse_json('{ "field_a": null }'):field_a) AS variant_null_value,
is_variant_null(parse_json('{ "field_a": null }'):missing) AS missing_sql_value_null
+--------+------------+------------------+----------------------+
|sql_null|variant_null|variant_null_value|missing_sql_value_null|
+--------+------------+------------------+----------------------+
| false| true| true| false|
+--------+------------+------------------+----------------------+