Değişken verileri sorgulama
Önemli
Bu özellik Genel Önizlemededir.
Bu makalede, olarak VARIANT
depolanan yarı yapılandırılmış verileri sorgulamak ve dönüştürmek için kullanabileceğiniz Databricks SQL işleçleri açıklanmaktadır. VARIANT
Veri türü Databricks Runtime 15.3 ve üzerinde kullanılabilir.
Databricks, JSON dizeleri üzerinden kullanılmasını VARIANT
önerir. Şu anda geçiş yapmak isteyen JSON dizelerini kullanan kullanıcılar için bkz . Değişken JSON dizelerinden nasıl farklıdır?.
JSON dizeleriyle depolanan yarı yapılandırılmış verileri sorgulamaya yönelik örnekler görmek istiyorsanız bkz . JSON dizelerini sorgulama.
Değişken sütunlu tablo oluşturma
olarak depolanan VARIANT
yüksek iç içe verilerle bir tablo oluşturmak için aşağıdaki sorguyu çalıştırın. Bu makaledeki örneklerin tümü bu tabloya başvurur.
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
Değişken sütunundaki alanları sorgulama
Azure Databricks'te JSON dizelerini ve diğer karmaşık veri türlerini sorgulama söz dizimi, aşağıdakiler de dahil olmak üzere veriler için VARIANT
geçerlidir:
- En üst düzey alanları seçmek için kullanın
:
. - adlandırılmış anahtarlara sahip iç içe alanları seçmek için veya
[<key>]
kullanın.
. - Dizilerden değerleri seçmek için kullanın
[<index>]
.
Not
Bir alan adı nokta ().
içeriyorsa, köşeli ayraç ([ ]
) ile bu alandan çıkmalısınız. Örneğin, aşağıdaki sorgu adlı zip.code
bir alan seçer:
SELECT raw:['zip.code'] FROM store_data
En üst düzey değişken alanını ayıklama
Bir alanı ayıklamak için ayıklama yolunuzda JSON alanının adını belirtin. Alan adları her zaman büyük/küçük harfe duyarlıdır.
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" |
+----------+-----------+
Yol bulunamazsa, sonuç türünde VARIANT
olurNULL
.
Değişken iç içe alanları ayıklama
noktalı gösterimi veya köşeli ayraç kullanarak iç içe alanları belirtirsiniz. Alan adları her zaman büyük/küçük harfe duyarlıdır.
-- 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 |
| } |
+------------------+
Yol bulunamazsa, sonuç türünde VARIANT
olurNULL
.
Değişken dizilerden değerleri ayıklama
Dizilerdeki öğeleri köşeli ayraçlarla dizinlersiniz. Dizinler 0 tabanlıdır.
-- Index elements
SELECT raw:store.fruit[0], raw:store.fruit[1] FROM store_data
+-------------------+------------------+
| fruit | fruit |
+-------------------+------------------+
| { | { |
| "type":"apple", | "type":"pear", |
| "weight":8 | "weight":9 |
| } | } |
+-------------------+------------------+
Yol bulunamazsa veya dizi dizini sınırların dışındaysa sonuç olur NULL
.
Değişken nesneleri ve dizileri düzleştirme
variant_explode
Tablo değerli oluşturucu işlevi, dizileri ve nesneleri düzleştirmede VARIANT
kullanılabilir.
Oluşturucu variant_explode
işlevi olduğundan, aşağıdaki örneklerde olduğu gibi bunu listede değil yan tümcesinin SELECT
bir parçası FROM
olarak kullanırsınız:
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"}|
+---+-----------------+
Değişken türü atama kuralları
Tür kullanarak VARIANT
dizileri ve skalerleri depolayabilirsiniz. Değişken türlerini diğer türlere atamaya çalışırken, normal atama kuralları aşağıdaki ek kurallarla birlikte tek tek değerler ve alanlar için geçerlidir.
Not
variant_get
yazın ve try_variant_get
tür bağımsız değişkenlerini alın ve bu tür oluşturma kurallarını izleyin.
Source type | Davranış |
---|---|
VOID |
Sonuç türündedir NULL VARIANT . |
ARRAY<elementType> |
olarak elementType atanabilecek VARIANT bir tür olmalıdır. |
veya schema_of_variant_agg
ile schema_of_variant
tür çıkarılırken, çözümlenebilen çakışan türler mevcut olduğunda işlevler tür yerine STRING
türe geri dönerVARIANT
.
Desteklenen veri türlerine değer vermek için veya cast
kullanabilirsiniz::
.
-- 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" |
| } |
+------------------+
Değişken null kuralları
Değişkenler iki tür null içerebilir:
- SQL
NULL
: SQLNULL
s değerin eksik olduğunu gösterir. Bunlar, yapılandırılmış verilerle ilgilenirken kullanılanlarla aynıdırNULL
. - Değişken
NULL
: DeğişkenNULL
s, değişkenin açıkça birNULL
değer içerdiğini gösterir. Değer verilerde depolandığındanNULL
, bunlar SQLNULL
ile aynı değildir.
Değişken değerinin is_variant_null
bir değişken NULL
olup olmadığını belirlemek için işlevini kullanın.
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|
+--------+------------+------------------+----------------------+