بيانات متغير الاستعلام
توضح هذه المقالة عوامل تشغيل Databricks SQL التي يمكنك استخدامها للاستعلام عن البيانات شبه المنظمة المخزنة وتحويلها ك VARIANT
. VARIANT
يتوفر نوع البيانات في Databricks Runtime 15.3 وما فوق.
توصي Databricks باستخدام VARIANT
سلاسل JSON. بالنسبة للمستخدمين الذين يستخدمون حاليا سلاسل JSON التي تبحث عن الترحيل، راجع كيف يختلف المتغير عن سلاسل JSON؟.
إذا كنت تريد الاطلاع على أمثلة للاستعلام عن البيانات شبه المنظمة المخزنة باستخدام سلاسل JSON، فشاهد الاستعلام عن سلاسل JSON.
إنشاء جدول بعمود متغير
قم بتشغيل الاستعلام التالي لإنشاء جدول مع بيانات متداخلة للغاية مخزنة ك VARIANT
. تشير الأمثلة الواردة في هذه المقالة إلى هذا الجدول.
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
حقول الاستعلام في عمود متغير
ينطبق بناء الجملة للاستعلام عن سلاسل JSON وأنواع البيانات المعقدة الأخرى على Azure Databricks على VARIANT
البيانات، بما في ذلك ما يلي:
- استخدم
:
لتحديد حقول المستوى الأعلى. - استخدم
.
أو[<key>]
لتحديد الحقول المتداخلة باستخدام مفاتيح مسماة. - استخدم
[<index>]
لتحديد القيم من الصفائف.
إشعار
إذا كان اسم الحقل يحتوي على نقطة (.
)، فيجب عليك تخطيها بأقواس مربعة ([ ]
). على سبيل المثال، يحدد الاستعلام التالي حقلا باسم zip.code
:
SELECT raw:['zip.code'] FROM store_data
استخراج حقل متغير من المستوى الأعلى
لاستخراج حقل، حدد اسم حقل JSON في مسار الاستخراج. أسماء الحقول دائما حساسة لحالة الأحرف.
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" |
+----------+-----------+
إذا تعذر العثور على مسار، تكون NULL
النتيجة من النوع VARIANT
.
استخراج الحقول المتداخلة المتغيرة
يمكنك تحديد الحقول المتداخلة من خلال تدوين النقطة أو استخدام الأقواس. أسماء الحقول دائما حساسة لحالة الأحرف.
-- 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 |
| } |
+------------------+
إذا تعذر العثور على مسار، تكون NULL
النتيجة من النوع VARIANT
.
استخراج القيم من صفائف متغيرة
يمكنك فهرسة العناصر في صفائف ذات أقواس. تستند المؤشرات إلى 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 |
| } | } |
+-------------------+------------------+
إذا تعذر العثور على المسار، أو إذا كان فهرس الصفيف خارج الحدود، فإن النتيجة هي NULL
.
تسوية الكائنات والصفائف المتغيرة
variant_explode
يمكن استخدام دالة المولد ذات القيمة الجدولية لتسطيح VARIANT
الصفائف والكائنات.
لأن variant_explode
هي دالة مولد، يمكنك استخدامها كجزء من FROM
عبارة بدلا من القائمة SELECT
، كما في الأمثلة التالية:
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"}|
+---+-----------------+
قواعد تحويل نوع المتغير
يمكنك تخزين الصفائف والأحجام باستخدام VARIANT
النوع. عند محاولة تحويل أنواع المتغيرات إلى أنواع أخرى، تنطبق قواعد التحويل العادية على القيم والحقول الفردية، مع القواعد الإضافية التالية.
إشعار
variant_get
وأخذ try_variant_get
وسيطات النوع واتبع قواعد التحويل هذه.
نوع المصدر | سلوك |
---|---|
VOID |
والنتيجة هي NULL من نوع VARIANT . |
ARRAY<elementType> |
elementType يجب أن يكون النوع الذي يمكن تحويله إلى VARIANT . |
عند الاستدلال على النوع مع schema_of_variant
أو schema_of_variant_agg
، تعود الدالات إلى VARIANT
الكتابة بدلا من STRING
الكتابة عند وجود أنواع متعارضة لا يمكن حلها.
يمكنك استخدام ::
أو cast
لإرسال القيم إلى أنواع البيانات المدعومة.
-- 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" |
| } |
+------------------+
قواعد فارغة متغيرة
يمكن أن تحتوي المتغيرات على نوعين من القيم الخالية:
- SQL
NULL
: تشير SQLNULL
s إلى أن القيمة مفقودة. هذه هي نفسهاNULL
عند التعامل مع البيانات المنظمة. - المتغير
NULL
: يشير المتغيرNULL
s إلى أن المتغير يحتوي بشكل صريح علىNULL
قيمة. هذه ليست نفس SQLNULL
s، لأن القيمة مخزنةNULL
في البيانات.
استخدم الدالة is_variant_null
لتحديد ما إذا كانت قيمة المتغير متغيرا 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|
+--------+------------+------------------+----------------------+