Frågevariantdata
Viktigt!
Den här funktionen finns som allmänt tillgänglig förhandsversion.
I den här artikeln beskrivs de Databricks SQL-operatorer som du kan använda för att fråga efter och transformera halvstrukturerade data som lagras som VARIANT
. Datatypen VARIANT
är tillgänglig i Databricks Runtime 15.3 och senare.
Databricks rekommenderar att du använder VARIANT
över JSON-strängar. För användare som för närvarande använder JSON-strängar som vill migrera, se Hur skiljer sig varianten från JSON-strängar?.
Om du vill se exempel för att köra frågor mot halvstrukturerade data som lagras med JSON-strängar läser du Fråga JSON-strängar.
Kommentar
VARIANT
kolumner kan inte användas för klustring av nycklar, partitioner eller Z-ordernycklar. Den VARIANT
datatypen kan inte användas för jämförelser, gruppering, ordning och uppsättningsåtgärder. En fullständig lista över begränsningar finns i Begränsningar.
Skapa en tabell med en variantkolumn
Kör följande fråga för att skapa en tabell med mycket kapslade data som lagras som VARIANT
. Exemplen i den här artikeln refererar alla till den här tabellen.
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
Frågefält i en variantkolumn
Syntaxen för att fråga efter JSON-strängar och andra komplexa datatyper i Azure Databricks gäller för VARIANT
data, inklusive följande:
- Använd
:
för att välja fält på den översta nivån. - Använd
.
eller[<key>]
för att välja kapslade fält med namngivna nycklar. - Använd
[<index>]
för att välja värden från matriser.
Kommentar
Om ett fältnamn innehåller en punkt (.
) måste du undvika det med hakparenteser ([ ]
). Följande fråga väljer till exempel ett fält med namnet zip.code
:
SELECT raw:['zip.code'] FROM store_data
Extrahera ett variantfält på den översta nivån
Om du vill extrahera ett fält anger du namnet på JSON-fältet i din extraheringssökväg. Fältnamn är alltid skiftlägeskänsliga.
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" |
+----------+-----------+
Om det inte går att hitta en sökväg är NULL
resultatet av typen VARIANT
.
Extrahera kapslade variantfält
Du anger kapslade fält via punkt notation eller med hakparenteser. Fältnamn är alltid skiftlägeskänsliga.
-- 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 |
| } |
+------------------+
Om det inte går att hitta en sökväg är NULL
resultatet av typen VARIANT
.
Extrahera värden från variantmatriser
Du indexeras element i matriser med hakparenteser. Index är 0-baserade.
-- Index elements
SELECT raw:store.fruit[0], raw:store.fruit[1] FROM store_data
+-------------------+------------------+
| fruit | fruit |
+-------------------+------------------+
| { | { |
| "type":"apple", | "type":"pear", |
| "weight":8 | "weight":9 |
| } | } |
+-------------------+------------------+
Om sökvägen inte kan hittas, eller om matrisindexet ligger utanför gränserna, blir NULL
resultatet .
Platta ut variantobjekt och matriser
Den tabellvärda generatorfunktionen variant_explode
kan användas för att platta ut VARIANT
arrayer och objekt.
Eftersom variant_explode
är en generatorfunktion använder du den som en del av FROM
-satsen i stället för i listan SELECT
, som i följande exempel:
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"}|
+---+-----------------+
Regler för gjutning av varianttyp
Du kan lagra matriser och skalärer med hjälp av VARIANT
typen . När du försöker omvandla varianttyper till andra typer gäller normala gjutningsregler för enskilda värden och fält, med följande ytterligare regler.
Kommentar
variant_get
och try_variant_get
ta typargument och följa dessa regler för gjutning.
Source type | Funktionssätt |
---|---|
VOID |
Resultatet är av NULL typen VARIANT . |
ARRAY<elementType> |
elementType Måste vara en typ som kan gjutas till VARIANT . |
När du härleder typen med schema_of_variant
eller schema_of_variant_agg
återgår funktionerna till typen i stället VARIANT
för STRING
typ när det finns motstridiga typer som inte kan lösas.
Du kan använda ::
eller cast
för att omvandla värden till datatyper som stöds.
-- 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" |
| } |
+------------------+
Variant null-regler
Varianter kan innehålla två typer av null:er:
-
SQL
NULL
: SQLNULL
s anger att värdet saknas. Dessa är sammaNULL
som vid hantering av strukturerade data. -
Variant
NULL
: VariantNULL
s anger att varianten uttryckligen innehåller ettNULL
värde. Dessa är inte samma som SQLNULL
eftersomNULL
värdet lagras i data.
is_variant_null
Använd funktionen för att avgöra om variantvärdet är en variant NULL
.
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|
+--------+------------+------------------+----------------------+