Query dati variant
Importante
Questa funzionalità è disponibile in anteprima pubblica.
Questo articolo descrive gli operatori SQL di Databricks che è possibile usare per eseguire query e trasformare dati semistrutturati archiviati come VARIANT
. Il VARIANT
tipo di dati è disponibile in Databricks Runtime 15.3 e versioni successive.
Databricks consiglia di usare VARIANT
le stringhe JSON. Per gli utenti che usano attualmente stringhe JSON che cercano di eseguire la migrazione, vedere Differenze tra varianti rispetto alle stringhe JSON.
Per visualizzare esempi per l'esecuzione di query su dati semistrutturati archiviati con stringhe JSON, vedere Eseguire query su stringhe JSON.
Nota
VARIANT
colonne non possono essere usate per chiavi di clustering, partizioni o chiavi di Z-order. Non è possibile utilizzare il tipo di dati VARIANT
per le operazioni di confronto, raggruppamento, ordinamento e set. Per un elenco completo delle limitazioni, vedere limitazioni .
Creare una tabella con una colonna variante
Eseguire la query seguente per creare una tabella con dati altamente annidati archiviati come VARIANT
. Gli esempi in questo articolo fanno riferimento a questa tabella.
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
Campi di query in una colonna variante
La sintassi per l'esecuzione di query su stringhe JSON e altri tipi di dati complessi in Azure Databricks si applica ai VARIANT
dati, tra cui:
- Usare
:
per selezionare i campi di primo livello. - Usare
.
o[<key>]
per selezionare campi annidati con chiavi denominate. - Usare
[<index>]
per selezionare i valori dalle matrici.
Nota
Se un nome di campo contiene un punto (.
), è necessario eseguirne l'escape con parentesi quadre ([ ]
). Ad esempio, la query seguente seleziona un campo denominato zip.code
:
SELECT raw:['zip.code'] FROM store_data
Estrarre un campo variant di primo livello
Per estrarre un campo, specificare il nome del campo JSON nel percorso di estrazione. I nomi dei campi fanno sempre distinzione tra maiuscole e minuscole.
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" |
+----------+-----------+
Se non è possibile trovare un percorso, il risultato è NULL
di tipo VARIANT
.
Estrarre campi annidati varianti
È possibile specificare campi annidati tramite notazione con punto o parentesi. I nomi dei campi fanno sempre distinzione tra maiuscole e minuscole.
-- 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 |
| } |
+------------------+
Se non è possibile trovare un percorso, il risultato è NULL
di tipo VARIANT
.
Estrarre valori da matrici varianti
Gli elementi vengono indicizzati in matrici con parentesi. Gli indici sono basati su 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 |
| } | } |
+-------------------+------------------+
Se non è possibile trovare il percorso o se l'indice di matrice non è compreso nei limiti, il risultato è NULL
.
Appiattire oggetti varianti e matrici
La variant_explode
funzione generatore con valori di tabella può essere usata per rendere flat VARIANT
matrici e oggetti.
Poiché variant_explode
è una funzione generatore, viene usata come parte della FROM
clausola anziché nell'elenco SELECT
, come negli esempi seguenti:
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"}|
+---+-----------------+
Regole di cast dei tipi varianti
È possibile archiviare matrici e scalari usando VARIANT
il tipo . Quando si tenta di eseguire il cast di tipi varianti ad altri tipi, le regole di cast normali si applicano a singoli valori e campi, con le regole aggiuntive seguenti.
Nota
variant_get
e try_variant_get
accettare argomenti di tipo e seguire queste regole di cast.
Tipo di origine | Comportamento |
---|---|
VOID |
Il risultato è di NULL tipo VARIANT . |
ARRAY<elementType> |
Deve elementType essere un tipo di cui è possibile eseguire il cast a VARIANT . |
Quando si deduce il tipo con schema_of_variant
o schema_of_variant_agg
, le funzioni eseguono il fallback al tipo anziché VARIANT
al STRING
tipo quando sono presenti tipi in conflitto che non possono essere risolti.
È possibile usare ::
o cast
per eseguire il cast dei valori ai tipi di dati supportati.
-- 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" |
| } |
+------------------+
Regole null varianti
Le varianti possono contenere due tipi di valori Null:
-
SQL
NULL
: SQLNULL
indica che il valore è mancante. Questi sono gli stessiNULL
di quando si gestiscono dati strutturati. -
Variant
NULL
: variantNULL
s indicano che la variante contiene in modo esplicito unNULL
valore. Non sono uguali a SQLNULL
, perché ilNULL
valore viene archiviato nei dati.
Usare la is_variant_null
funzione per determinare se il valore variant è una variante 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|
+--------+------------+------------------+----------------------+