بيانات التعريف المشتركة لتحليلات Azure Synapse

تسمح تحليلات Azure Synapse للمحركات الحسابية المختلفة في مساحة العمل بمشاركة قواعد البيانات والجداول بين مجموعات Apache Spark ومجموعة SQL بلا خادم.

بمجرد إنشاء قاعدة بيانات بواسطة مهمة Spark، يمكنك إنشاء جداول فيها باستخدام Spark الذي يستخدم Parquet أو Delta أو CSV كتنسيق تخزين. سيتم تحويل أسماء الجداول إلى حالة أقل، وتحتاج إلى الاستعلام عنها باستخدام اسم الحالة الأقل. سوف تصبح هذه الجداول متاحة للاستعلام عن طريق أي من مجموعات Azure Synapse workspace Spark. كما يمكن استخدامها من أي من وظائف Spark الخاضعة للأذونات.

تتوافر أيضًا الجداول الخارجية التي تم إنشاؤها، وإدارتها، بواسطة Spark على أنها جداول خارجية بنفس الاسم الوارد في قاعدة البيانات المتزامنة المطابقة في مجموعة SQL بدون خادم. عرض جدول Spark في SQL يوفر المزيد من التفاصيل حول مزامنة الجدول.

نظرا لأن الجداول متزامنة مع مجموعة SQL بدون خادم بشكل غير متزامن، سيكون هناك تأخير صغير حتى تظهر.

إدارة جدول تم إنشاؤه بواسطة Spark

استخدم Spark لإدارة قواعد البيانات التي تم إنشاؤها بواسطة Spark. على سبيل المثال، احذفها من خلال مهمة مجموعة Apache Spark بدون خادم، وإنشاء جداول فيها من Spark.

لا يمكن تعديل الكائنات الموجودة في قواعد البيانات المتزامنة من مجموعة SQL بدون خادم.

عرض جدول Spark في SQL

جداول Spark المشتركة

يوفر Spark نوعين من الجداول التي يعرضها Azure Synapse في SQL تلقائيًّا:

  • الجداول المدارة

    يوفر Spark العديد من الخيارات لكيفية تخزين البيانات في الجداول المدارة، مثل TEXT، وCSV، وJSON، وJDBC، وPARQUET، وORC، وHIVE، و DELTA وLIBSVM. يتم تخزين هذه الملفات عادة في warehouse الدليل حيث تُخزن بيانات الجدول المدارة.

  • الجداول الخارجية

    يوفر Spark أيضًا طرقًا لإنشاء جداول خارجية عبر البيانات الموجودة، إما عن طريق توفير الخيار LOCATION أو باستخدام تنسيق الخلية. يمكن أن تكون هذه الجداول الخارجية على مجموعة متنوعة من تنسيقات البيانات، بما في ذلك Parquet.

يشارك Azure Synapse حاليًّا جداول Spark المدارة والخارجية فقط التي تخزن بياناتها بتنسيق Parquet أو Delta أو CSV باستخدام محركات SQL. لا تتم مزامنة الجداول المدعومة بتنسيقات أخرى تلقائيًّا. قد تتمكن من مزامنة مثل هذه الجداول بشكل صريح بنفسك كجدول خارجي في قاعدة بيانات SQL الخاصة بك إذا كان محرك SQL يدعم التنسيق الأساسي للجدول.

إشعار

حاليًا، يتم دعم تنسيقات Parquet وCSV كليًا فقط في تجمع SQL بدون خادم. تتوفر جداول Spark Delta أيضا في تجمع SQL بلا خادم، ولكن هذه الميزة في المعاينة العامة. الجداول الخارجية التي تم إنشاؤها في Spark غير متوفرة في قواعد بيانات تجمع SQL المخصصة.

مشاركة جداول Spark

جداول Spark المدارة والخارجية القابلة للمشاركة التي تم كشفها في مشغل SQL كجداول خارجية ذات الخصائص التالية:

  • مصدر بيانات الجدول الخارجي SQL هو مصدر البيانات الذي يمثل مجلد موقع جدول Spark.
  • تنسيق ملف الجدول الخارجي SQL هو Parquet أو Delta أو CSV.
  • يتم تمرير بيانات اعتماد وصول الجدول الخارجي SQL.

بما أن كافة أسماء جداول Spark تكون أسماء جدول SQL صالحة وكافة أسماء أعمدة Spark تكون أسماء أعمدة SQL صالحة، ستُستخدم أسماء أعمدة وجدول Spark للجدول الخارجي SQL.

توفر جداول Spark أنواع بيانات مختلفة عن محركات Synapse SQL. يعين الجدول التالي أنواع بيانات جدول Spark إلى أنواع SQL:

نوع بيانات Spark نوع بيانات SQL التعليقات
LongType, long, bigint bigint Spark: LongType يمثل أعدادًا صحيحة موقعة 8 بايت.
SQL: انظر int، bigint، smallint، وصغيرة.
BooleanType, boolean bit (Parquet)، varchar(6) (CSV) شرارة: منطقية.
SQL: انظر [/sql/t-sql/data-types/bit-transact-sql).
DecimalType, decimal, dec, numeric decimal Spark: DecimalType يمثل أعدادًا عشرية موقعة عشوائية الدقة. مدعوم داخليًّا من قبل java.math.BigDecimal. يتكون BigDecimal من قيمة عشوائية دقيقة صحيحة غير محددة الحجم ومقياس عدد صحيح 32 بت.
SQL: الدقة الثابتة وأرقام المقياس. عند استخدام الدقة القصوى، تكون القيم الصالحة من - 10^38 +1 إلى 10^38 - 1. مرادفات ISO العشرية هي dec وdec(p, s). الرقمية تكون مطابقة وظيفيًّا للعشرية. انظر العشري والرقمي.
IntegerType, Integer, int int SparkIntegerType يمثل عددًا صحيحًا موقع 4 بايت.
SQL: انظر int، bigint، smallint، وصغيرة.
ByteType, Byte, tinyint smallint Spark: ByteType يمثل عددًا صحيحًا موقع 1 بايت [-128 إلى 127] وShortType يمثل عددًا صحيحًا موقع 2 بايت [-32768 إلى 32767].
SQL: Tinyint يمثل عددًا صحيحًا موقع 1 بايت [0، 255] وsmallint يمثل عددًا صحيحًا موقع 2 بايت [-32768، 32767]. انظر int وbigint وsmallint وtinyint
ShortType, Short, smallint smallint مثل أعلاه.
DoubleType, Double float Spark: DoubleType يمثل أرقام نقاط عائمة مزدوجة الدقة 8 بايت. SQL: انظر float (حر) وreal (فعلي).
FloatType, float, real real Spark: FloatType يمثل أعداد النقطة العائمة ذات الدقة المزدوجة 4 بايت. SQL: انظر float (حر) وreal (فعلي).
DateType, date date Spark: DateType يمثل القيم التي تتضمن قيم حقول السنة، والشهر، واليوم، بدون منطقة زمنية.
SQL: انظر date (التاريخ).
TimestampType, timestamp datetime2 Spark: TimestampType يمثل القيم التي تتضمن قيم حقول السنة، والشهر، واليوم، والساعة، والدقيقة، والثانية، مع المنطقة الزمنية المحلية لجلسة العمل. تمثل قيمة الطابع الزمني نقطة زمنية مطلقة.
SQL: انظر datetime2.
char char
StringType, String, varchar Varchar(n) Spark: StringType يمثل قيم سلسلة أحرف. VarcharType(n) هو متغير StringType الذي يحتوي على حد طول. ستفشل كتابة البيانات إذا تجاوزت سلسلة الإدخال الحد الأقصى للطول. يمكن استخدام هذا النوع فقط في مخطط الجدول، وليس في الوظائف/عوامل التشغيل.
CharType(n) هو متغير VarcharType(n) ذو طول ثابت. يقوم عمود القراءة من نوع CharType(n) دائمًا بإرجاع سلسلة قيم الطول n. مقارنة عمود CharType(n) سوف تمدد الطول القصير إلى الأطول.
SQL: إذا كان هناك طول المقدمة من سبارك، ن في varchar(n) سيتم تعيين إلى هذا الطول. إذا كان العمود مقسمًا، يمكن أن يكون n كحد أقصى 2048. وإلا، سيكون varchar(max). انظر char وvarchar.
استخدمه مع ترتيب Latin1_General_100_BIN2_UTF8.
BinaryType, binary varbinary(n) SQL: إذا كان هناك طول المقدمة من Spark، n في varchar(n) سيتم تعيين إلى هذا الطول. إذا كان العمود مقسمًا، يمكن أن يكون n كحد أقصى 2048. وإلا، سيكون varchar(max). انظر binary وvarbinary.
array, map, struct varchar(max) SQL: يسلسل إلى JSON بترتيب Latin1_General_100_BIN2_UTF8. اطلع على بيانات JSON.

إشعار

ترتيب مستوى قاعدة البيانات هو Latin1_General_100_CI_AS_SC_UTF8.

نموذج الأمان

سوف تؤمن قواعد بيانات وجداول Spark، جنبًا إلى جنب مع تمثيلاتها المتزامنة في محرك SQL، على مستوى التخزين الأساسي. بما أنهم ليس لديهم أذونات حاليًّا على الكائنات نفسها، يمكن رؤية الكائنات في متصفح الكائنات.

يعتبر حساب الأمان الأساسي الذي يُنشئ جدولًا مدارًا بمثابة مالك هذا الجدول، ولديه كافة الحقوق في الجدول، بالإضافة إلى المجلدات والملفات الأساسية. بالإضافة إلى ذلك، سوف يصبح مالك قاعدة البيانات تلقائيًّا المالك المشارك للجدول.

إذا أنشأت جدولًا خارجيًّا باستخدام Spark أو SQL مع المرور خلال المصادقة، يتم تأمين البيانات فقط على مستويات المجلد والملف. إذا استعلم شخص ما عن هذا النوع من الجدول الخارجي، يتم تمرير هوية أمان مرسل الاستعلام وصولًا إلى نظام الملفات، الذي سوف يتحقق من حقوق الوصول.

لمزيد من المعلومات حول كيفية تعيين الأذونات على المجلدات والملفات، راجع قاعدة البيانات المشتركة Azure Synapse Analytics.

الأمثلة

إنشاء جدول مدار في Spark والاستعلام من مجموعة SQL بدون خادم

في هذا السيناريو، لديك قاعدة بيانات Spark المسماة mytestdb. راجع إنشاء قاعدة بيانات Spark ووصلها بمجموعة SQL بدون خادم.

إنشاء جدول Spark مدار باستخدام SparkSQL بواسطة تشغيل الأمر التالي:

    CREATE TABLE mytestdb.myparquettable(id int, name string, birthdate date) USING Parquet

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

    USE mytestdb;
    SELECT * FROM sys.tables;

تحقق من myparquettable تضمين ذلك في النتائج.

إشعار

لن تتم مزامنة جدول لا يستخدم Delta أو Parquet أو CSV كتنسيق التخزين الخاص به.

بعد ذلك، إدراج بعض القيم في الجدول من Spark، على سبيل المثال بعبارات C# Spark التالية في دفتر ملاحظات C#‎:

using Microsoft.Spark.Sql.Types;

var data = new List<GenericRow>();

data.Add(new GenericRow(new object[] { 1, "Alice", new Date(2010, 1, 1)}));
data.Add(new GenericRow(new object[] { 2, "Bob", new Date(1990, 1, 1)}));

var schema = new StructType
    (new List<StructField>()
        {
            new StructField("id", new IntegerType()),
            new StructField("name", new StringType()),
            new StructField("birthdate", new DateType())
        }
    );

var df = spark.CreateDataFrame(data, schema);
df.Write().Mode(SaveMode.Append).InsertInto("mytestdb.myparquettable");

الآن يمكنك قراءة البيانات من مجموعة SQL بدون خادم كما يلي:

SELECT * FROM mytestdb.dbo.myparquettable WHERE name = 'Alice';

يجب أن تحصل على الصف التالي كنتيجة:

id | name | birthdate
---+-------+-----------
1 | Alice | 2010-01-01

إنشاء جدول خارجي في Spark والاستعلام من مجموعة SQL بدون خادم

في هذا المثال، سوف نقوم بإنشاء جدول Spark خارجي عبر ملفات بيانات Parquet التي تم إنشاؤها في المثال السابق للجدول المدار.

على سبيل المثال، شغل باستخدام SparkSQL:

CREATE TABLE mytestdb.myexternalparquettable
    USING Parquet
    LOCATION "abfss://<storage-name>.dfs.core.windows.net/<fs>/synapse/workspaces/<synapse_ws>/warehouse/mytestdb.db/myparquettable/"

استبدل العنصر النائب <storage-name> باسم حساب تخزين ADLS Gen2 الذي تستخدمه، و<fs> باسم نظام الملفات الذي تستخدمه والعنصر النائب <synapse_ws> باسم مساحة عمل Synapse التي تستخدمها لتشغيل هذا المثال.

ينشئ المثال السابق الجدول myextneralparquettable في قاعدة البيانات mytestdb. بعد تأخير قصير، يمكنك مشاهدة الجدول في مجموعة SQL بدون خادم. على سبيل المثال، قم بتشغيل العبارة التالية من مجموعة SQL بدون خادم.

USE mytestdb;
SELECT * FROM sys.tables;

تحقق من myexternalparquettable تضمين ذلك في النتائج.

الآن يمكنك قراءة البيانات من مجموعة SQL بدون خادم كما يلي:

SELECT * FROM mytestdb.dbo.myexternalparquettable WHERE name = 'Alice';

يجب أن تحصل على الصف التالي كنتيجة:

id | name | birthdate
---+-------+-----------
1 | Alice | 2010-01-01

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