بيانات التعريف المشتركة لتحليلات 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 |
يمثل Spark IntegerType 4 بايت من أرقام الأعداد الصحيحة الموقعة. SQL: انظر int، bigint، smallint، وصغيرة. |
ByteType ، ، Byte tinyint |
smallint |
Spark: يمثل ByteType 1 بايت عدد صحيح موقع [-128 إلى 127] ويمثل ShortType رقمين صحيحين موقعين بالبايت [-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.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>
النائب باسم مساحة عمل Azure 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