أنواع الاستعلام المتداخلة في ملفات Parquet وJSON باستخدام تجمع SQL بدون خادم في Azure Synapse Analytics

في هذه المقالة، ستتعرف على كيفية كتابة استعلام باستخدام تجمع SQL بدون خادم في Azure Synapse Analytics. سيقرأ الاستعلام أنواع الباركيه المتداخلة. الأنواع المتداخلة هي هياكل معقدة تمثل الكائنات أو المصفوفات. يمكن تخزين الأنواع المتداخلة في:

  • باركيه، حيث يمكنك الحصول على أعمدة معقدة متعددة تحتوي على صفائف وكائنات.
  • ملفات JSON هرمية، حيث يمكنك قراءة مستند JSON معقد كعمود واحد.
  • مجموعات قاعدة بيانات Azure Cosmos (حاليا قيد المعاينة العامة المسورة)، حيث يمكن أن يحتوي كل مستند على خصائص متداخلة معقدة.

يقوم تجمع SQL بدون خادم بتنسيق جميع الأنواع المتداخلة ككائنات JSON ومصفوفات. حتى تتمكن من استخراج الكائنات المعقدة أو تعديلها باستخدام دالات JSON أوتحليل بيانات JSON باستخدام الدالة OPENJSON.

فيما يلي مثال على استعلام يستخرج القيم العددية وقيم الكائنات من ملف JSON لمجموعة بيانات البحث المفتوح COVID-19 ، والذي يحتوي على كائنات متداخلة:

SELECT
    title = JSON_VALUE(doc, '$.metadata.title'),
    first_author = JSON_QUERY(doc, '$.metadata.authors[0]'),
    first_author_name = JSON_VALUE(doc, '$.metadata.authors[0].first'),
    complex_object = doc
FROM
    OPENROWSET(
        BULK 'https://azureopendatastorage.blob.core.windows.net/covid19temp/comm_use_subset/pdf_json/000b7d1517ceebb34e1e3e817695b6de03e2fa78.json',
        FORMAT='CSV', FIELDTERMINATOR ='0x0b', FIELDQUOTE = '0x0b', ROWTERMINATOR = '0x0b'
    )
    WITH ( doc varchar(MAX) ) AS docs;

ترجع الدالة JSON_VALUE قيمة رقمية من الحقل في المسار المحدد. ترجع الدالة JSON_QUERY كائنا منسقا بتنسيق JSON من الحقل في المسار المحدد.

هام

يستخدم هذا المثال ملفا من مجموعة بيانات البحث المفتوح ل COVID-19. انظر الترخيص وهيكل البيانات هنا.

المتطلبات الأساسية

الخطوة الأولى هي إنشاء قاعدة بيانات حيث سيتم إنشاء مصدر البيانات. ستقوم بعد ذلك بتهيئة الكائنات عن طريق تشغيل برنامج نصي للإعداد على قاعدة البيانات. سيقوم البرنامج النصي للإعداد بإنشاء مصادر البيانات وبيانات الاعتماد ذات نطاق قاعدة البيانات وتنسيقات الملفات الخارجية المستخدمة في العينات.

بيانات المشروع المتداخلة أو المتكررة

يمكن أن يحتوي ملف Parquet على أعمدة متعددة بأنواع معقدة. يتم تنسيق القيم من هذه الأعمدة كنص JSON ويتم إرجاعها كأعمدة VARCHAR. يقرأ الاستعلام التالي الملف structexample.parquet ويوضح كيفية قراءة قيم الأعمدة المتداخلة:

SELECT
    DateStruct, TimeStruct, TimestampStruct, DecimalStruct, FloatStruct
FROM
    OPENROWSET(
        BULK 'parquet/nested/structExample.parquet',
        DATA_SOURCE = 'SqlOnDemandDemo',
        FORMAT='PARQUET'
    )
    WITH (
        DateStruct VARCHAR(8000),
        TimeStruct VARCHAR(8000),
        TimestampStruct VARCHAR(8000),
        DecimalStruct VARCHAR(8000),
        FloatStruct VARCHAR(8000)
    ) AS [r];

يرجع هذا الاستعلام النتيجة التالية. يتم إرجاع محتوى كل كائن متداخل كنص JSON.

DateStruct TimeStruct الهيكل الزمني البنية العشرية FloatStruct
{"تاريخ":"2009-04-25"} {"الوقت":"20:51:54.3598000"} {"الطابع الزمني":"5501-04-08 12:13:57.4821000"} {"عشري":11143412.25350} {"تعويم":0.5}
{"التاريخ":"1916-04-29"} {"الوقت":"00:16:04.6778000"} {"الطابع الزمني":"1990-06-30 20:50:52.6828000"} {"عشري":1963545.62800} {"تعويم":-2.125}

يقرأ الاستعلام التالي الملف justSimpleArray.parquet. يعرض جميع الأعمدة من ملف Parquet ، بما في ذلك البيانات المتداخلة والمتكررة.

SELECT
    SimpleArray
FROM
    OPENROWSET(
        BULK 'parquet/nested/justSimpleArray.parquet',
        DATA_SOURCE = 'SqlOnDemandDemo',
        FORMAT='PARQUET'
    ) AS [r];

سيؤدي هذا الاستعلام إلى إرجاع النتيجة التالية:

سيمبل لايف
[11,12,13]
[21,22,23]

قراءة الخصائص من أعمدة الكائنات المتداخلة

تمكنك الوظيفة JSON_VALUE من إرجاع القيم من الأعمدة المنسقة كنص JSON:

SELECT
    title = JSON_VALUE(complex_column, '$.metadata.title'),
    first_author_name = JSON_VALUE(complex_column, '$.metadata.authors[0].first'),
    body_text = JSON_VALUE(complex_column, '$.body_text.text'),
    complex_column
FROM
    OPENROWSET( BULK 'https://azureopendatastorage.blob.core.windows.net/covid19temp/comm_use_subset/pdf_json/000b7d1517ceebb34e1e3e817695b6de03e2fa78.json',
                FORMAT='CSV', FIELDTERMINATOR ='0x0b', FIELDQUOTE = '0x0b', ROWTERMINATOR = '0x0b' ) WITH ( complex_column varchar(MAX) ) AS docs;

تظهر النتيجة في الجدول التالي:

العنوان first_author_name body_text complex_column
معلومات تكميلية وبائية إيكولوجية... جوليان - الشكل S1 : Phylogeny of ... { "paper_id": "000b7d1517ceebb34e1e3e817695b6de03e2fa78", "metadata": { "title": "Supplementary Information An eco-epidemiological study of Morbilli-related paramyxovirus infection in Madagascar bats reveals host-switching as the dominant macro-evolutionary mechanism", "authors": [ { "first": "Julien"

على عكس ملفات JSON ، التي ترجع في معظم الحالات عمودا واحدا يحتوي على كائن JSON معقد ، يمكن أن تحتوي ملفات Parquet على أعمدة معقدة متعددة. يمكنك قراءة خصائص الأعمدة المتداخلة باستخدام الدالة الموجودة JSON_VALUE على كل عمود. OPENROWSET تمكنك من تحديد مسارات الخصائص المتداخلة في جملة WITH مباشرة. يمكنك تعيين المسارات كاسم عمود، أو يمكنك إضافة تعبير مسار JSON بعد كتابة العمود.

يقرأ الاستعلام التالي الملف structexample.parquet ويوضح كيفية عرض عناصر عمود متداخل. هناك طريقتان للإشارة إلى قيمة متداخلة:

  • عن طريق تحديد تعبير مسار القيمة المتداخلة بعد مواصفات الكتابة.
  • عن طريق تنسيق اسم العمود كمسار متداخل باستخدام do "." للإشارة إلى الحقول.
SELECT
    *
FROM
    OPENROWSET(
        BULK 'parquet/nested/structExample.parquet',
        DATA_SOURCE = 'SqlOnDemandDemo',
        FORMAT='PARQUET'
    )
    WITH (
        [DateValue] DATE '$.DateStruct.Date',
        [TimeStruct.Time] TIME,
        [TimestampStruct.Timestamp] DATETIME2,
        DecimalValue DECIMAL(18, 5) '$.DecimalStruct.Decimal',
        [FloatStruct.Float] FLOAT
    ) AS [r];

عناصر الوصول من الأعمدة المكررة

يقرأ الاستعلام التالي الملف justSimpleArray.parquet ويستخدم JSON_VALUE لاسترداد عنصر عددي من داخل عمود متكرر، مثل صفيف أو خريطة:

SELECT
    *,
    JSON_VALUE(SimpleArray, '$[0]') AS FirstElement,
    JSON_VALUE(SimpleArray, '$[1]') AS SecondElement,
    JSON_VALUE(SimpleArray, '$[2]') AS ThirdElement
FROM
    OPENROWSET(
        BULK 'parquet/nested/justSimpleArray.parquet',
        DATA_SOURCE = 'SqlOnDemandDemo',
        FORMAT='PARQUET'
    ) AS [r];

ها هي النتيجة:

سيمبل لايف أولاالعنصر الأول العنصر الثاني العنصر الثالث
[11,12,13] 11 12 13
[21,22,23] 21 22 23

الوصول إلى الكائنات الفرعية من الأعمدة المعقدة

يقرأ الاستعلام التالي الملف mapexample.parquet ويستخدم JSON_QUERY لاسترداد عنصر غير عددي من داخل عمود متكرر، مثل صفيف أو خريطة:

SELECT
    MapOfPersons,
    JSON_QUERY(MapOfPersons, '$."John Doe"') AS [John]
FROM
    OPENROWSET(
        BULK 'parquet/nested/mapExample.parquet',
        DATA_SOURCE = 'SqlOnDemandDemo',
        FORMAT='PARQUET'
    ) AS [r];

يمكنك أيضا الإشارة صراحة إلى الأعمدة التي تريد إرجاعها في جملة WITH :

SELECT DocId,
    MapOfPersons,
    JSON_QUERY(MapOfPersons, '$."John Doe"') AS [John]
FROM
    OPENROWSET(
        BULK 'parquet/nested/mapExample.parquet',
        DATA_SOURCE = 'SqlOnDemandDemo',
        FORMAT='PARQUET'
    ) 
    WITH (DocId bigint, MapOfPersons VARCHAR(max)) AS [r];

يتم إرجاع البنية MapOfPersons كعمود VARCHAR وتنسيقها كسلسلة JSON.

Project القيم من الأعمدة المتكررة

إذا كان لديك صفيف من القيم العددية (على سبيل المثال [1,2,3]) في بعض الأعمدة، فيمكنك توسيعها بسهولة وضمها إلى الصف الرئيسي باستخدام هذا البرنامج النصي:

SELECT
    SimpleArray, Element
FROM
    OPENROWSET(
        BULK 'parquet/nested/justSimpleArray.parquet',
        DATA_SOURCE = 'SqlOnDemandDemo',
        FORMAT='PARQUET'
    ) AS arrays
    CROSS APPLY OPENJSON (SimpleArray) WITH (Element int '$') as array_values

الخطوات التالية

ستوضح لك المقالة التالية كيفية الاستعلام عن ملفات JSON.