Variánsadatok lekérdezése
Fontos
Ez a funkció a nyilvános előzetes verzióban érhető el.
Ez a cikk a Részben strukturált adatok VARIANT
lekérdezéséhez és átalakításához használható Databricks SQL-operátorokat ismerteti. Az VARIANT
adattípus a Databricks Runtime 15.3-ban és újabb verziókban érhető el.
A Databricks JSON-sztringek használatát VARIANT
javasolja. A migrálni kívánt JSON-sztringeket jelenleg használó felhasználók esetében lásd: Hogyan különbözik a változat a JSON-sztringekétól?
Ha JSON-sztringekkel tárolt félig strukturált adatok lekérdezésére szeretne példákat látni, tekintse meg a JSON-sztringek lekérdezését.
Feljegyzés
VARIANT
oszlopok nem használhatók fürtözési kulcsokhoz, partíciókhoz vagy Z-rendelési kulcsokhoz. A VARIANT
adattípus nem használható összehasonlításhoz, csoportosításhoz, rendezéshez és beállításhoz. A korlátozások teljes listáját a Korlátozásokcímű témakörben találja.
Tábla létrehozása variánsoszloppal
Futtassa a következő lekérdezést egy olyan tábla létrehozásához, amely a következőként VARIANT
tárolt, magas beágyazottségű adatokat tartalmazza: A cikkben szereplő példák mind erre a táblára hivatkoznak.
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
Lekérdezésmezők egy variánsoszlopban
Az Azure Databricks JSON-sztringjeinek és egyéb összetett adattípusainak lekérdezésére szolgáló szintaxis az adatokra VARIANT
vonatkozik, beleértve a következőket:
- Felső szintű mezők kiválasztására használható
:
. - Nevesített kulcsokkal rendelkező beágyazott mezők használata
.
vagy[<key>]
kijelölése. - Tömbök értékeinek kiválasztására használható
[<index>]
.
Feljegyzés
Ha egy mezőnév tartalmaz egy pontot (.
), szögletes zárójelekkel ([ ]
) kell feloldania. A következő lekérdezés például kiválaszt egy mezőt zip.code
:
SELECT raw:['zip.code'] FROM store_data
Felső szintű variánsmező kinyerve
Mező kinyeréséhez adja meg a JSON-mező nevét a kinyerési útvonalon. A mezőnevek mindig megkülönböztetik a kis- és nagybetűket.
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" |
+----------+-----------+
Ha nem található elérési út, az eredmény NULL
típusa .VARIANT
Variánsok beágyazott mezőinek kinyerés
Beágyazott mezőket pont jelöléssel vagy szögletes zárójelek használatával adhat meg. A mezőnevek mindig megkülönböztetik a kis- és nagybetűket.
-- 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 |
| } |
+------------------+
Ha nem található elérési út, az eredmény NULL
típusa .VARIANT
Értékek kinyerve a variánstömbökből
Zárójelekkel rendelkező tömbök elemeit indexelheti. Az indexek 0-alapúak.
-- Index elements
SELECT raw:store.fruit[0], raw:store.fruit[1] FROM store_data
+-------------------+------------------+
| fruit | fruit |
+-------------------+------------------+
| { | { |
| "type":"apple", | "type":"pear", |
| "weight":8 | "weight":9 |
| } | } |
+-------------------+------------------+
Ha az elérési út nem található, vagy ha a tömbindex kívül esik a korlátokon, az eredmény az .NULL
Variáns objektumok és tömbök simítása
A variant_explode
táblaértékű generátorfüggvény tömbök és objektumok simítására VARIANT
használható.
Mivel variant_explode
egy generátorfüggvény, a záradék részeként FROM
használja, nem pedig a SELECT
listában, ahogyan az alábbi példákban is látható:
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"}|
+---+-----------------+
Variáns típusú öntési szabályok
Tömböket és skalárokat típussal VARIANT
tárolhat. Amikor más típusokra próbál változattípusokat leadni, a normál öntési szabályok az egyes értékekre és mezőkre vonatkoznak, az alábbi további szabályokkal.
Feljegyzés
variant_get
és try_variant_get
írjon be típusargumentumokat, és kövesse ezeket az öntési szabályokat.
Forrás típusa | Működés |
---|---|
VOID |
Az eredmény NULL típus.VARIANT |
ARRAY<elementType> |
A elementType típusnak olyan típusnak kell lennie, amelybe be lehet öntöttetni VARIANT . |
Ha a típust a következővel vagy a függvényekkel schema_of_variant
adhatja meg, a függvények a típus helyett schema_of_variant_agg
a típusra VARIANT
esnek vissza, ha olyan ütköző típusok vannak jelen, amelyek nem oldhatók fel.STRING
Az értékeket a támogatott adattípusokhoz használhatja ::
vagy cast
vetítheti.
-- 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 szabályok
A variánsok kétféle null értéket tartalmazhatnak:
-
SQL
NULL
: Az SQL-ekNULL
azt jelzik, hogy az érték hiányzik. Ezek ugyanazokNULL
, mint a strukturált adatok kezelésekor. -
Variant
NULL
: Az s változatNULL
azt jelzi, hogy a variáns explicit módon tartalmaz egyNULL
értéket. Ezek nem azonosak az SQLNULL
s-ekkel, mert azNULL
érték az adatokban van tárolva.
is_variant_null
A függvény használatával állapítsa meg, hogy a variáns értéke egy variáns.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|
+--------+------------+------------------+----------------------+