ملفات Query Delta Lake باستخدام تجمع SQL بلا خادم في Azure Synapse Analytics

في هذه المقالة، ستتعلم كيفية كتابة استعلام باستخدام تجمع Synapse SQL بدون خادم لقراءة ملفات Delta Lake. Delta Lake عبارة عن طبقة تخزين مفتوحة المصدر توفر معاملات ACID (آلية الرجوع والاتساق والعزل والمتانة) إلى Apache Spark وأعباء عمل البيانات الضخمة. يمكنك معرفة المزيد من كيفية الاستعلام عن فيديو جداول delta lake.

تجمع SQL بلا خادم في مساحة عمل Synapse يمكنك من قراءة البيانات المخزنة بتنسيق Delta Lake، وخدمتها في أدوات إعداد التقارير. تجمع SQL بلا خادم يمكنه قراءة ملفات Delta Lake التي تم إنشاؤها باستخدام Apache Spark أو Azure Databricks أو أي منتج آخر لتنسيق Delta Lake.

تجمعات Apache Spark في Azure Synapse تمكن مهندسي البيانات من تعديل ملفات Delta Lake باستخدام Scala وPySpark و.NET. تجمعات SQL بلا خادم تساعد محللي البيانات على إنشاء تقارير حول ملفات Delta Lake التي أنشأها مهندسو البيانات.

هام

الاستعلام عن تنسيق Delta Lake باستخدام تجمع SQL بلا خادم هو وظيفة متوفرة بشكل عام. ومع ذلك، لا يزال الاستعلام عن جداول Spark Delta في المعاينة العامة وليس جاهزا للإنتاج. هناك مشكلات معروفة قد تحدث إذا قمت بالاستعلام عن جداول Delta التي تم إنشاؤها باستخدام تجمعات Spark. راجع المشكلات المعروفة في المساعدة الذاتية لتجمع SQL بلا خادم.

مثال على البدء السريع

تمكنك خاصية OPENROWSET من قراءة محتوى ملفات Delta Lake عن طريق تزويد محدد مواقع ويب لمجلدك الجذر.

قراءة مجلد Delta Lake

أسهل طريقة لمعرفة محتوى ملف DELTA خاصتك هو تزويد محدد مواقع ويب للملف إلى الدالة OPENROWSET وتحديد تنسيق DELTA. إذا كان الملف متوفرا بشكل عام أو إذا كان بإمكان هوية Microsoft Entra الوصول إلى هذا الملف، يجب أن تتمكن من رؤية محتوى الملف باستخدام استعلام مثل الاستعلام الموضح في المثال التالي:

SELECT TOP 10 *
FROM OPENROWSET(
    BULK 'https://sqlondemandstorage.blob.core.windows.net/delta-lake/covid/',
    FORMAT = 'delta') as rows;

أسماء الأعمدة وأنواع البيانات تتم قراءتها تلقائياً من ملفات Delta Lake. تستخدم الدالة OPENROWSET أفضل أنواع التخمين مثل VARCHAR(1000) لأعمدة السلسلة.

يجب أن يشير معرف الموارد المنتظم في الدالة OPENROWSET إلى المجلد الجذر Delta Lake الذي يحتوي على مجلد فرعي يسمى _delta_log.

ECDC COVID-19 Delta Lake folder

إذا لم يكن لديك هذا المجلد الفرعي، فأنت لا تستخدم تنسيق Delta Lake. يمكنك تحويل ملفات Parquet العادية في المجلد إلى تنسيق Delta Lake باستخدام البرنامج النصي Apache Spark Python التالي:

%%pyspark
from delta.tables import DeltaTable
deltaTable = DeltaTable.convertToDelta(spark, "parquet.`abfss://delta-lake@sqlondemandstorage.dfs.core.windows.net/covid`")

لتحسين أداء الاستعلامات، خذ بعين الاعتبار تحديد أنواع صريحة في WITH عبارة .

إشعار

يستخدم تجمع Synapse SQL بلا خادم استنتاج المخطط لتحديد الأعمدة وأنواعها تلقائيًا. قواعد استنتاج المخطط هي نفسها المستخدمة لملفات Parquet. لتعيين نوع Delta Lake إلى النوع الأصلي من SQL، حدد تعيين النوع لـ Parquet.

تأكد من إمكانية الوصول إلى الملف. إذا كان ملفك محمياً باستخدام مفتاح SAS أو هوية Azure المخصصة، فستحتاج إلى إعداد بيانات اعتماد على مستوى خادم لتسجيل الدخول إلى sql.

هام

تأكد من أنك تستخدم ترتيب قاعدة بيانات UTF-8 (على سبيل المثال Latin1_General_100_BIN2_UTF8) لأن قيم السلسلة في ملفات Delta Lake يتم ترميزها باستخدام ترميز UTF-8. قد يتسبب عدم تطابق بين ترميز النص في ملف Delta Lake والترتيب في حدوث أخطاء تحويل غير متوقعة. يمكنك بسهولة تغيير الترتيب الافتراضي لقاعدة البيانات الحالية باستخدام عبارة T-SQL التالية: ALTER DATABASE CURRENT COLLATE Latin1_General_100_BIN2_UTF8; لمزيد من المعلومات حول الترتيب، راجع أنواع الترتيب المدعومة ل Synapse SQL.

استخدام مصادر البيانات

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

هام

لا يمكن إنشاء مصادر البيانات إلا في قواعد البيانات المخصصة (ليس في قاعدة البيانات الرئيسية أو قواعد البيانات المنسوخة نسخا متماثلا من تجمعات Apache Spark).

لاستخدام العينات أدناه، ستحتاج إلى إكمال الخطوة التالية:

  1. إنشاء قاعدة بيانات بمصدر بيانات يشير إلى حساب تخزين NYC Yellow Taxi.
  2. قم بتهيئة الكائنات عن طريق تنفيذ برنامج نصي للإعداد على قاعدة البيانات التي أنشأتها في الخطوة 1. سيقوم برنامج الإعداد النصي هذا بإنشاء مصادر البيانات وبيانات اعتماد في نطاق قاعدة البيانات وتنسيقات الملفات الخارجية المستخدمة في هذه العينات.

إذا أنشأت قاعدة البيانات الخاصة بك، وبدلت السياق إلى قاعدة البيانات الخاصة بك (باستخدام العبارة USE database_name أو القائمة المنسدلة لتحديد قاعدة البيانات في بعض محرر الاستعلام)، يمكنك إنشاء مصدر البيانات الخارجي الذي يحتوي على معرف الموارد المنتظم الجذر إلى مجموعة البيانات واستخدامه للاستعلام عن ملفات Delta Lake:

CREATE EXTERNAL DATA SOURCE DeltaLakeStorage
WITH ( LOCATION = 'https://sqlondemandstorage.blob.core.windows.net/delta-lake/' );
GO

SELECT TOP 10 *
FROM OPENROWSET(
        BULK 'covid',
        DATA_SOURCE = 'DeltaLakeStorage',
        FORMAT = 'delta'
    ) as rows;

إذا كان مصدر البيانات محميًا بمفتاح SAS أو بهوية مخصصة، فيمكنك تكوين مصدر البيانات باستخدام بيانات الاعتماد المحددة في نطاق قاعدة البيانات.

تحديد المخطط بشكل صريح

يمكّنك OPENROWSET من التحديد الصريح للأعمدة التي تريد قراءتها من الملف باستخدام عبارة WITH:

SELECT TOP 10 *
FROM OPENROWSET(
        BULK 'covid',
        DATA_SOURCE = 'DeltaLakeStorage',
        FORMAT = 'delta'
    )
    WITH ( date_rep date,
           cases int,
           geo_id varchar(6)
           ) as rows;

باستخدام المواصفات الصريحة لمخطط مجموعة النتائج، يمكنك تقليل أحجام النوع واستخدام الأنواع الأكثر دقة VARCHAR(6) لأعمدة السلسلة بدلا من VARCHAR(1000) المتشائم. تصغير الأنواع قد يؤدي إلى تحسين أداء الاستعلامات بشكل كبير.

هام

تأكد من أنك تحدد بوضوح ترتيب UTF-8 (على سبيل المثال Latin1_General_100_BIN2_UTF8) لجميع أعمدة السلسلة في عبارة WITH أو قم بتعيين ترتيب UTF-8 على مستوى قاعدة البيانات. عدم التطابق بين ترميز النص في الملف وترتيب عمود السلسلة إلى قد يؤدي حدوث أخطاء تحويل غير متوقعة. يمكنك بسهولة تغيير الترتيب الافتراضي لقاعدة البيانات الحالية باستخدام عبارة T-SQL التالية: alter database current collate Latin1_General_100_BIN2_UTF8 يمكنك بسهولة تعيين التجميع على أنواع العمود باستخدام التعريف التالي: geo_id varchar(6) collate Latin1_General_100_BIN2_UTF8

مجموعة البيانات

يتم استخدام مجموعة بيانات NYC Yellow Taxi في هذا النموذج. يتم تحويل مجموعة البيانات الأصلية PARQUET إلى DELTA تنسيق، ويتم استخدام الإصدار DELTA في الأمثلة.

بيانات مقسمة للاستعلام

مجموعة البيانات الواردة في هذه العينة مقسمة (مقسمة) إلى مجلدات فرعية منفصلة.

على عكس Parquet، لا تحتاج إلى استهداف أقسام معينة باستخدام الدالة FILEPATH. سيحدد OPENROWSET أعمدة التقسيم في بنية مجلد Delta Lake الخاص بك وسيمكنك من الاستعلام مباشرة عن البيانات باستخدام هذه الأعمدة. يوضح هذا المثال قيم الأجرة لكل سنة وشهر وpayment_type للأشهر الثلاثة الأولى من عام 2017.

SELECT
        YEAR(pickup_datetime) AS year,
        passenger_count,
        COUNT(*) AS cnt
FROM  
    OPENROWSET(
        BULK 'yellow',
        DATA_SOURCE = 'DeltaLakeStorage',
        FORMAT='DELTA'
    ) nyc
WHERE
    nyc.year = 2017
    AND nyc.month IN (1, 2, 3)
    AND pickup_datetime BETWEEN CAST('1/1/2017' AS datetime) AND CAST('3/31/2017' AS datetime)
GROUP BY
    passenger_count,
    YEAR(pickup_datetime)
ORDER BY
    YEAR(pickup_datetime),
    passenger_count;

ستزيل الدالة OPENROWSET الأقسام التي لا تتطابق مع year وmonth في عبارة where. تقنية اقتطاع الملفات/ الأقسام هذه ستؤدي إلى تقليل مجموعة البيانات بشكل كبير، وتحسين الأداء، وتقليل تكلفة الاستعلام.

اسم المجلد في الدالة OPENROWSET (yellow في هذا المثال) موصول باستخدام LOCATION في مصدر البيانات DeltaLakeStorage، ولابد أن يشير إلى المجلد الجذر Delta Lake الذي يحتوي على مجلد فرعي يسمى _delta_log.

Yellow Taxi Delta Lake folder

إذا لم يكن لديك هذا المجلد الفرعي، فأنت لا تستخدم تنسيق Delta Lake. يمكنك تحويل ملفات Parquet العادية في المجلد إلى تنسيق Delta Lake باستخدام البرنامج النصي Apache Spark Python التالي:

%%pyspark
from delta.tables import DeltaTable
deltaTable = DeltaTable.convertToDelta(spark, "parquet.`abfss://delta-lake@sqlondemandstorage.dfs.core.windows.net/yellow`", "year INT, month INT")

الوسيطة الثانية للدالة DeltaTable.convertToDeltaLake تمثل أعمدة التقسيم (السنة والشهر) التي تشكل جزءًا من نمط المجلد (year=*/month=* في هذا المثال) وأنواعها.

القيود

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

تقدم إلى المقالة التالية لمعرفة كيفية الاستعلام عن أنواع Parquet المتداخلة. إذا كنت ترغب في متابعة إنشاء حل Delta Lake، فتعرف على كيفية إنشاء طرق عرض أو جداول خارجية على مجلد Delta Lake.

(راجع أيضًا )