الاستعلام عن ملفات JSON باستخدام تجمع SQL بدون خادم في Azure Synapse Analytics
خلال هذه المقالة، ستتعلم كيفية كتابة استعلام باستخدام تجمع SQL بلا خادم في Azure Synapse Analytics. يمثل هدف الاستعلام قراءة ملفات JSON باستخدام OPENROWSET.
- ملفات JSON القياسية، حيث يتم تخزين وثائق JSON متعددة كمصفوفة JSON.
- ملفات JSON المحددة بسطور، حيث يتم فصل مستندات JSON بحرف سطر جديد. الامتدادات الشائعة لهذه الأنواع من الملفات هي
jsonl
وldjson
وndjson
.
قراءة وثائق JSON
إن أسهل طريقة للاطلاع على محتوى ملف JSON الخاص بك هي تقديم عنوان URL للملف إلى الدالة OPENROWSET
، وتحديد csv FORMAT
، وتعيين قيم 0x0b
لـ fieldterminator
وfieldquote
. إذا كنت بحاجة إلى قراءة ملف JSON محدد الأسطر، فهذا يكفي. إذا كان لديك ملف JSON كلاسيكي، فستحتاج إلى تعيين قيم 0x0b
ل rowterminator
. ستقوم الدالة OPENROWSET
بتحليل JSON وإرجاع كل مستند بالتنسيق التالي:
مستند |
---|
{"date_rep":"2020-07-24","day":24,"month":7,"year":2020,"cases":3,"deaths":0,"geo_id":"AF"} |
{"date_rep":"2020-07-25","day":25,"month":7,"year":2020,"cases":7,"deaths":0,"geo_id":"AF"} |
{"date_rep":"2020-07-26","day":26,"month":7,"year":2020,"cases":4,"deaths":0,"geo_id":"AF"} |
{"date_rep":"2020-07-27","day":27,"month":7,"year":2020,"cases":8,"deaths":0,"geo_id":"AF"} |
إذا كان الملف متوفرا للجمهور، أو إذا كانت هوية Microsoft Entra الخاصة بك يمكنها الوصول إلى هذا الملف، يجب أن تشاهد محتوى الملف باستخدام الاستعلام مثل الاستعلام الموضح في الأمثلة التالية.
قراءة ملفات JSON
يقرأ نموذج الاستعلام التالي ملفات JSON وملفات JSON المحددة بسطر، ويعيد كل مستند كصف منفصل.
select top 10 *
from openrowset(
bulk 'https://pandemicdatalake.blob.core.windows.net/public/curated/covid-19/ecdc_cases/latest/ecdc_cases.jsonl',
format = 'csv',
fieldterminator ='0x0b',
fieldquote = '0x0b'
) with (doc nvarchar(max)) as rows
go
select top 10 *
from openrowset(
bulk 'https://pandemicdatalake.blob.core.windows.net/public/curated/covid-19/ecdc_cases/latest/ecdc_cases.json',
format = 'csv',
fieldterminator ='0x0b',
fieldquote = '0x0b',
rowterminator = '0x0b' --> You need to override rowterminator to read classic JSON
) with (doc nvarchar(max)) as rows
يتضمن مستند JSON في استعلام العينة السابقة صفيفًا من العناصر. يقوم الاستعلام بإرجاع كل عنصر كسجل منفصل في مجموعة النتائج. تأكد من أنه يمكنك الوصول إلى هذا الملف. إذا كان الملف محميًا بمفتاح SAS أو هوية مخصصة، فستحتاج إلى إعداد معلومات تسجيل الدخول على مستوى الخادم لتسجيل الدخول على SQL.
استخدام مصادر البيانات
يستخدم المثال السابق المسار الكامل للملف. كبديل، يمكنك إنشاء مصدر بيانات خارجي بالموقع الذي يشير إلى المجلد الجذر للتخزين، واستخدام مصدر البيانات هذا والمسار النسبي للملف في دالة OPENROWSET
:
create external data source covid
with ( location = 'https://pandemicdatalake.blob.core.windows.net/public/curated/covid-19/ecdc_cases' );
go
select top 10 *
from openrowset(
bulk 'latest/ecdc_cases.jsonl',
data_source = 'covid',
format = 'csv',
fieldterminator ='0x0b',
fieldquote = '0x0b'
) with (doc nvarchar(max)) as rows
go
select top 10 *
from openrowset(
bulk 'latest/ecdc_cases.json',
data_source = 'covid',
format = 'csv',
fieldterminator ='0x0b',
fieldquote = '0x0b',
rowterminator = '0x0b' --> You need to override rowterminator to read classic JSON
) with (doc nvarchar(max)) as rows
إذا كان مصدر البيانات محميًا بمفتاح SAS أو بهوية مخصصة، فيمكنك تكوين مصدر البيانات باستخدام بيانات الاعتماد المحددة في نطاق قاعدة البيانات.
في الأقسام التالية، يمكنك مشاهدة كيفية الاستعلام عن أنواع مختلفة من ملفات JSON.
توزيع مستندات JSON
تقوم الاستعلامات في الأمثلة السابقة بإرجاع كل مستند JSON كسلسلة واحدة في سجل منفصل من مجموعة النتائج. يمكنك استخدام الدالتين JSON_VALUE
وOPENJSON
لتحليل القيم في مستندات JSON وإعادتها كقيم علائقية، كما هو موضح في المثال التالي:
date_rep | الحالات | geo_id |
---|---|---|
2020-07-24 | 3 | AF |
2020-07-25 | 7 | AF |
2020-07-26 | 4 | AF |
2020-07-27 | 8 | AF |
نموذج مستند JSON
تقرأ أمثلة الاستعلام ملفات json التي تحتوي على مستندات بالبنية التالية:
{
"date_rep":"2020-07-24",
"day":24,"month":7,"year":2020,
"cases":13,"deaths":0,
"countries_and_territories":"Afghanistan",
"geo_id":"AF",
"country_territory_code":"AFG",
"continent_exp":"Asia",
"load_date":"2020-07-25 00:05:14",
"iso_country":"AF"
}
إشعار
إذا تم تخزين هذه المستندات على هيئة JSON محددة الأسطر، فأنت بحاجة إلى تعيين FIELDTERMINATOR
وFIELDQUOTE
على 0x0b. إذا كان لديك تنسيق JSON قياسي، فأنت بحاجة إلى ضبط ROWTERMINATOR
على 0x0b.
الاستعلام عن ملفات JSON باستخدام JSON_VALUE
يوضح لك الاستعلام أدناه كيفية استخدام JSON_VALUE لاسترداد القيم العددية (date_rep
، countries_and_territories
، cases
) من مستندات JSON:
select
JSON_VALUE(doc, '$.date_rep') AS date_reported,
JSON_VALUE(doc, '$.countries_and_territories') AS country,
CAST(JSON_VALUE(doc, '$.deaths') AS INT) as fatal,
JSON_VALUE(doc, '$.cases') as cases,
doc
from openrowset(
bulk 'latest/ecdc_cases.jsonl',
data_source = 'covid',
format = 'csv',
fieldterminator ='0x0b',
fieldquote = '0x0b'
) with (doc nvarchar(max)) as rows
order by JSON_VALUE(doc, '$.geo_id') desc
بمجرد استخراج خصائص JSON من وثيقة JSON، يمكنك تحديد الأسماء المستعارة للعمود وتحويل القيمة النصية إلى نوع ما اختياريًا.
الاستعلام عن ملفات JSON باستخدام OPENJSON
يستخدم الاستعلام التالي OPENJSON. وسوف تسترجع إحصاءات COVID المبلغ عنها في صربيا:
select
*
from openrowset(
bulk 'latest/ecdc_cases.jsonl',
data_source = 'covid',
format = 'csv',
fieldterminator ='0x0b',
fieldquote = '0x0b'
) with (doc nvarchar(max)) as rows
cross apply openjson (doc)
with ( date_rep datetime2,
cases int,
fatal int '$.deaths',
country varchar(100) '$.countries_and_territories')
where country = 'Serbia'
order by country, date_rep desc;
النتائج وظيفية مماثلة للنتائج التي تم إرجاعها باستخدام الدالة JSON_VALUE
. في بعض الحالات، قد يكون لـ OPENJSON
ميزة على JSON_VALUE
:
- في عبارة
WITH
يمكنك بشكل صريح تعيين أسماء الأعمدة المستعارة وأنواع كل خاصية. لست بحاجة إلى وضع الدالةCAST
في كل عمود في قائمةSELECT
. - قد تكون
OPENJSON
أسرع إذا كنت تقوم بإرجاع عدد كبير من الخصائص. إذا كنت تقوم بإرجاع خاصية أو خاصيتين فحسب، فقد تكون دالةOPENJSON
فوقية. - يجب عليك استخدام الدالة
OPENJSON
إذا كنت بحاجة إلى تحليل المصفوفة من كل مستند، وربطها بالصف الأصلي.
الخطوات التالية
ستوضح المقالات التالية في هذه السلسلة كيفية: