Megosztás a következőn keresztül:


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 VARIANTleké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 VARIANTtá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-ek NULLazt jelzik, hogy az érték hiányzik. Ezek ugyanazok NULL, mint a strukturált adatok kezelésekor.
  • Variant NULL: Az s változat NULLazt jelzi, hogy a variáns explicit módon tartalmaz egy NULL értéket. Ezek nem azonosak az SQL NULLs-ekkel, mert az NULL é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|
+--------+------------+------------------+----------------------+