فهم تعليمة Apache Spark البرمجية لمطوري U-SQL

هام

تم إيقاف Azure Data Lake Analytics في 29 فبراير 2024. تعرف على المزيد من خلال هذا الإعلان.

بالنسبة إلى تحليلات البيانات، يمكن لمؤسستك استخدام Azure Synapse Analytics أو Microsoft Fabric.

يوفر هذا القسم إرشادات عالية المستوى حول تحويل البرامج النصية U-SQL إلى Apache Spark.

فهم لغة U-SQL وSpark ونماذج المعالجة

قبل البدء في ترحيل البرامج النصية U-SQL ل Azure Data Lake Analytics إلى Spark، من المفيد فهم اللغة العامة وفلسفات المعالجة للنظامين.

U-SQL هي لغة استعلام تعريفية تشبه SQL تستخدم نموذج تدفق البيانات وتسمح لك بتضمين التعليمات البرمجية للمستخدم المكتوبة بلغة .NET (على سبيل المثال C#) وPython وR وتوسيع نطاقها بسهولة. يمكن لملحقات المستخدم تنفيذ تعبيرات بسيطة أو وظائف معرفة من قبل المستخدم، ولكن يمكن أن توفر للمستخدم أيضا القدرة على تنفيذ ما يسمى عوامل التشغيل المعرفة من قبل المستخدم التي تنفذ عوامل تشغيل مخصصة لإجراء تحويلات على مستوى مجموعة الصفوف والاستخراجات وكتابة الإخراج.

Spark هو إطار عمل موسع يوفر العديد من روابط اللغات في Scala وJava وPython و.NET وما إلى ذلك، حيث تكتب التعليمات البرمجية الخاصة بك في المقام الأول بإحدى هذه اللغات، وتنشئ تجريدات البيانات تسمى مجموعات البيانات الموزعة المرنة (RDD) وإطارات البيانات ومجموعات البيانات ثم تستخدم لغة خاصة بالمجال تشبه LINQ (DSL) لتحويلها. كما يوفر SparkSQL كبيانات فرعية تعريفية على تجريدات إطار البيانات ومجموعة البيانات. يوفر DSL فئتين من العمليات والتحويلات والإجراءات. لن يؤدي تطبيق التحويلات على تجريدات البيانات إلى تنفيذ التحويل ولكن بدلا من ذلك قم ببناء خطة التنفيذ التي سيتم إرسالها للتقييم باستخدام إجراء (على سبيل المثال، كتابة النتيجة في جدول مؤقت أو ملف أو طباعة النتيجة).

وبالتالي عند ترجمة برنامج نصي U-SQL إلى برنامج Spark، سيتعين عليك تحديد اللغة التي تريد استخدامها لإنشاء تجريد إطار البيانات على الأقل (وهو حاليا تجريد البيانات الأكثر استخداما) وما إذا كنت تريد كتابة تحويلات تدفق البيانات التعريفية باستخدام DSL أو SparkSQL. في بعض الحالات الأكثر تعقيدا، قد تحتاج إلى تقسيم البرنامج النصي U-SQL إلى سلسلة من Spark والخطوات الأخرى التي يتم تنفيذها باستخدام Azure Batch أو Azure Functions.

علاوة على ذلك، يقدم Azure Data Lake Analytics U-SQL في بيئة خدمة وظيفة بلا خادم حيث يتم تخصيص الموارد لكل وظيفة، بينما يقدم Azure Synapse Spark وAzure Databricks وAzure HDInsight Spark إما في شكل خدمة نظام مجموعة أو مع ما يسمى قوالب تجمع Spark. عند تحويل التطبيق الخاص بك، سيتعين عليك مراعاة الآثار المترتبة الآن على إنشاء المجموعات أو التجمعات وتغيير حجمها وتوسيع نطاقها وإيقاف تشغيلها.

تحويل البرامج النصية U-SQL

تتبع البرامج النصية U-SQL نمط المعالجة التالي:

  1. تتم قراءة البيانات إما من الملفات غير المنظمة، باستخدام EXTRACT العبارة أو الموقع أو مواصفات مجموعة الملفات، وأداة الاستخراج المضمنة أو المعرفة من قبل المستخدم والمخطط المطلوب، أو من جداول U-SQL (الجداول المدارة أو الخارجية). يتم تمثيله كمجموعة صفوف.
  2. يتم تحويل مجموعات الصفوف في عبارات U-SQL متعددة تطبق تعبيرات U-SQL على مجموعات الصفوف وتنتج مجموعات صفوف جديدة.
  3. وأخيرا، يتم إخراج مجموعات الصفوف الناتجة في أي من الملفات باستخدام OUTPUT العبارة التي تحدد الموقع (المواقع) ومخرج مضمن أو معرف من قبل المستخدم، أو في جدول U-SQL.

يتم تقييم البرنامج النصي ببطء، ما يعني أن كل خطوة استخراج وتحويل تتكون في شجرة تعبير ويتم تقييمها عالميا (تدفق البيانات).

تشبه برامج Spark من حيث أنك ستستخدم موصلات Spark لقراءة البيانات وإنشاء إطارات البيانات، ثم تطبيق التحويلات على إطارات البيانات باستخدام إما DSL أو SparkSQL المشابهة ل LINQ، ثم كتابة النتيجة في ملفات أو جداول Spark المؤقتة أو بعض أنواع لغات البرمجة أو وحدة التحكم.

تحويل التعليمات البرمجية ل .NET

لغة تعبير U-SQL هي C# وتوفر طرقا مختلفة لتوسيع نطاق التعليمات البرمجية المخصصة ل .NET باستخدام الوظائف المعرفة من قبل المستخدم والمشغلين المعرفين من قبل المستخدم والمجمعات المعرفة من قبل المستخدم.

يدعم كل من Azure Synapse وAzure HDInsight Spark الآن تنفيذ التعليمات البرمجية .NET باستخدام .NET ل Apache Spark. وهذا يعني أنه يمكنك إعادة استخدام بعض أو جميع الدالات المعرفة من قبل المستخدم .NET باستخدام Spark. لاحظ أن U-SQL يستخدم .NET Framework بينما يعتمد .NET ل Apache Spark على .NET Core 3.1 أو أحدث.

تستخدم عوامل التشغيل المعرفة من قبل المستخدم U-SQL (UDOs) نموذج U-SQL UDO لتوفير تنفيذ موسع للتعليمات البرمجية للمشغل. وبالتالي، يجب إعادة كتابة UDOs في وظائف معرفة من قبل المستخدم لتلائم نموذج تنفيذ Spark.

لا يدعم .NET ل Apache Spark حاليا التجميعات المعرفة من قبل المستخدم. وبالتالي، يجب ترجمة المجمعات المعرفة من قبل المستخدم U-SQL إلى مجمعات Spark المعرفة من قبل المستخدم المكتوبة بلغة Scala.

إذا كنت لا تريد الاستفادة من .NET لقدرات Apache Spark، يتعين عليك إعادة كتابة تعبيراتك في تعبير Spark أو Scala أو Java أو Python أو دالة أو مجمع أو موصل مكافئ.

على أي حال، إذا كان لديك كمية كبيرة من منطق .NET في البرامج النصية U-SQL، يرجى الاتصال بنا من خلال ممثل حساب Microsoft للحصول على مزيد من الإرشادات.

التفاصيل التالية مخصصة للحالات المختلفة لاستخدامات .NET وC# في البرامج النصية U-SQL.

تحويل تعبيرات U-SQL# المضمنة العددية

لغة تعبير U-SQL هي C#. يتم تنفيذ العديد من تعبيرات U-SQL المضمنة العددية في الأصل لتحسين الأداء، بينما يمكن تنفيذ تعبيرات أكثر تعقيدا من خلال استدعاء إطار عمل .NET.

يحتوي Spark على لغة التعبير العددي الخاصة به (إما كجزء من DSL أو في SparkSQL) ويسمح بالاتصال بالوظائف المعرفة من قبل المستخدم المكتوبة لوقت تشغيل JVM أو .NET أو Python.

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

يجب أن تدرك أن .NET وC# لها دلالات نوع مختلفة عن أوقات تشغيل JVM وPython وDSL ل Spark. راجع أدناه لمزيد من التفاصيل حول اختلافات نظام النوع.

تحويل دالات .NET العددية المعرفة من قبل المستخدم والمجمعات المعرفة من قبل المستخدم

يوفر U-SQL طرقا لاستدعاء دالات .NET العددية العشوائية واستدعاء مجمعات معرفة من قبل المستخدم مكتوبة في .NET.

يوفر Spark أيضا الدعم للوظائف المعرفة من قبل المستخدم والتجميعات المعرفة من قبل المستخدم المكتوبة في معظم لغات الاستضافة الخاصة به والتي يمكن استدعاؤها من DSL وSparkSQL من Spark.

كما ذكر أعلاه، يدعم .NET ل Apache Spark الوظائف المعرفة من قبل المستخدم والمكتوبة في .NET، ولكنه لا يدعم التجميعات المعرفة من قبل المستخدم. لذلك بالنسبة للوظائف المعرفة من قبل المستخدم، يمكن استخدام .NET ل Apache Spark، بينما يجب تأليف التجميعات المعرفة من قبل المستخدم في Scala ل Spark.

تحويل عوامل التشغيل المعرفة من قبل المستخدم (UDOs)

يوفر U-SQL عدة فئات من عوامل التشغيل المعرفة من قبل المستخدم (UDOs) مثل أدوات الاستخراج والمخرجات والمخفضات والمعالجات والأجهزة والمجمعات التي يمكن كتابتها في .NET (و- إلى حد ما - في Python وR).

لا يقدم Spark نفس نموذج القابلية للتوسعة للمشغلين، ولكنه يتمتع بقدرات مكافئة للبعض.

Spark المكافئ للمخرجات والمخرجات هو موصلات Spark. بالنسبة للعديد من مستخرجات U-SQL، قد تجد موصلا مكافئا في مجتمع Spark. بالنسبة للآخرين، سيتعين عليك كتابة موصل مخصص. إذا كان مستخرج U-SQL معقدا ويستخدم العديد من مكتبات .NET، فقد يكون من الأفضل إنشاء موصل في Scala يستخدم interop لاستدعاء مكتبة .NET التي تقوم بالمعالجة الفعلية للبيانات. في هذه الحالة، سيتعين عليك نشر وقت تشغيل .NET Core إلى نظام مجموعة Spark والتأكد من أن مكتبات .NET المشار إليها متوافقة مع .NET Standard 2.0.

ستحتاج الأنواع الأخرى من U-SQL UDOs إلى إعادة كتابتها باستخدام الدالات والمجمعات المعرفة من قبل المستخدم وتعبير Spark DLS أو SparkSQL المناسب دلاليا. على سبيل المثال، يمكن تعيين معالج إلى SELECT لاستدعاءات UDF المختلفة، وتعبئتها كدالة تأخذ إطار بيانات كوسيطة وترجع إطار بيانات.

تحويل مكتبات U-SQL الاختيارية

يوفر U-SQL مجموعة من المكتبات الاختيارية والعروض التوضيحية التي توفر Python وR وJSON وXML ودعم AVRO وبعض إمكانات خدمات Azure الذكاء الاصطناعي.

يوفر Spark تكامل Python وR الخاص به، pySpark وSparkR على التوالي، ويوفر موصلات لقراءة وكتابة JSON وXML وAVRO.

إذا كنت بحاجة إلى تحويل برنامج نصي يشير إلى مكتبات خدمات Azure الذكاء الاصطناعي، نوصي بالاتصال بنا عبر ممثل حساب Microsoft الخاص بك.

تحويل القيم التي تم كتابتها

نظرا لأن نظام نوع U-SQL يستند إلى نظام نوع .NET وSpark لديه نظام نوع خاص به يتأثر بربط لغة المضيف، يتعين عليك التأكد من أن الأنواع التي تعمل عليها قريبة وبالنسبة لأنواع معينة، قد تختلف نطاقات الأنواع والدقة و/أو المقياس قليلا. علاوة على ذلك، يتعامل U-SQL وSpark مع null القيم بشكل مختلف.

أنواع البيانات

يعطي الجدول التالي الأنواع المكافئة في Spark وSc scala وPySpark لأنواع U-SQL المحددة.

U-SQL Spark Scala PySpark
byte
sbyte ByteType Byte ByteType
int IntegerType Int IntegerType
uint
long LongType Long LongType
ulong
float FloatType Float FloatType
double DoubleType Double DoubleType
decimal DecimalType java.math.BigDecimal DecimalType
short ShortType Short ShortType
ushort
char Char
string StringType String StringType
DateTime DateType, TimestampType java.sql.Date, java.sql.Timestamp DateType, TimestampType
bool BooleanType Boolean BooleanType
Guid
byte[] BinaryType Array[Byte] BinaryType
SQL.MAP<K,V> MapType(keyType, valueType, valueContainsNull) scala.collection.Map MapType(keyType, valueType, valueContainsNull=True)
SQL.ARRAY<T> ArrayType(elementType, containsNull) scala.collection.Seq ArrayType(elementType, containsNull=True)

لمزيد من المعلومات، راجع:

علاج NULL

في Spark، تسمح الأنواع لكل افتراضي بقيم NULL بينما في U-SQL، يمكنك وضع علامة على العددي، غير الكائن على أنه يقبل القيم الخالية. بينما يسمح لك Spark بتعريف عمود على أنه غير قابل للقيمة الخالية، فإنه لن يفرض القيد وقد يؤدي إلى نتيجة خاطئة.

في Spark، تشير NULL إلى أن القيمة غير معروفة. تختلف قيمة Spark NULL عن أي قيمة، بما في ذلك نفسها. ترجع المقارنات بين قيمتي Spark NULL، أو بين قيمة NULL وأي قيمة أخرى، غير معروف لأن قيمة كل NULL غير معروفة.

يختلف هذا السلوك عن U-SQL، الذي يتبع دلالات C# حيث null يختلف عن أي قيمة ولكنه يساوي نفسه.

وبالتالي فإن عبارة SparkSQL SELECT التي تستخدم WHERE column_name = NULL ترجع صفر صفوف حتى إذا كانت هناك قيم NULL في column_name، بينما في U-SQL، فإنها ترجع الصفوف حيث column_name تم تعيين إلى null. وبالمثل، ترجع عبارة Spark SELECT التي تستخدم WHERE column_name != NULL صفر صفوف حتى إذا كانت هناك قيم غير خالية في column_name، بينما في U-SQL، فإنها ترجع الصفوف التي تحتوي على غير فارغة. وبالتالي، إذا كنت تريد دلالات التحقق من القيم الخالية U-SQL، يجب عليك استخدام isnull و isnotnull على التوالي (أو ما يعادلها DSL).

تحويل كائنات كتالوج U-SQL

أحد الاختلافات الرئيسية هو أن U-SQL Scripts يمكنها الاستفادة من كائنات الكتالوج الخاصة بها، وكثير منها ليس لها مكافئ Spark مباشر.

يوفر Spark الدعم لمفاهيم مخزن Hive Meta، أساسا قواعد البيانات والجداول وطرق العرض، حتى تتمكن من تعيين قواعد بيانات U-SQL والمخططات لقواعد بيانات Hive وجداول U-SQL إلى جداول Spark (راجع نقل البيانات المخزنة في جداول U-SQL)، ولكن ليس لديها دعم للوظائف ذات القيمة الجدولية (TVFs) والإجراءات المخزنة وتجميعات U-SQL ومصادر البيانات الخارجية وما إلى ذلك.

يمكن تصميم كائنات التعليمات البرمجية U-SQL مثل طرق العرض وTVFs والإجراءات المخزنة والتجميعات من خلال وظائف التعليمات البرمجية والمكتبات في Spark والإشارة إليها باستخدام دالة لغة المضيف وآليات التجريد الإجرائية (على سبيل المثال، من خلال استيراد وحدات Python النمطية أو الرجوع إلى دالات Scala).

إذا تم استخدام كتالوج U-SQL لمشاركة البيانات وعناصر التعليمات البرمجية عبر المشاريع والفرق، فيجب استخدام آليات مكافئة للمشاركة (على سبيل المثال، Maven لمشاركة كائنات التعليمات البرمجية).

تحويل تعبيرات مجموعة صفوف U-SQL والتعبيرات العددية المستندة إلى SQL

تقوم اللغة الأساسية ل U-SQL بتحويل مجموعات الصفوف وتعتمد على SQL. فيما يلي قائمة غير متتابعة لتعبيرات مجموعة الصفوف الأكثر شيوعا المقدمة في U-SQL:

  • SELECT/FROM/WHERE/GROUP BY+التجميعات+HAVING/ORDER BY+FETCH

  • INNER/OUTER/CROSS/SEMIJOIN التعابير

  • CROSS/OUTERAPPLY التعابير

  • PIVOT/UNPIVOT التعابير

  • VALUES منشئ مجموعة الصفوف

  • تعيين التعبيرات UNION/OUTER UNION/INTERSECT/EXCEPT

بالإضافة إلى ذلك، يوفر U-SQL العديد من التعبيرات العددية المستندة إلى SQL مثل

  • OVER تعبيرات النوافذ
  • العديد من المجمعات المضمنة ووظائف الترتيب (SUMوما FIRST إلى ذلك)
  • بعض التعبيرات العددية SQL الأكثر شيوعا: CASE، ، LIKE(NOT) IN، AND، OR إلخ.

يوفر Spark تعبيرات مكافئة في كل من نموذج DSL وSparkSQL لمعظم هذه التعبيرات. يجب إعادة كتابة بعض التعبيرات غير المدعومة أصلا في Spark باستخدام مجموعة من تعبيرات Spark الأصلية وأنماط مكافئة دلاليا. فعلى سبيل المثال، OUTER UNION سيتعين ترجمتها إلى مجموعة مكافئة من الإسقاطات والاتحادات.

نظرا إلى المعالجة المختلفة لقيم NULL، ستتطابق صلة U-SQL دائما مع صف إذا كان كلا العمودين اللذين تتم مقارنتها يحتويان على قيمة NULL، بينما لن يتطابق الربط في Spark مع مثل هذه الأعمدة ما لم تتم إضافة عمليات فحص فارغة صريحة.

تحويل مفاهيم U-SQL الأخرى

يوفر U-SQL أيضا ميزات ومفاهيم أخرى مختلفة، مثل الاستعلامات الموحدة مقابل قواعد بيانات SQL Server والمعلمات والمتغيرات العددية ومتغيرات تعبير lambda ومتغيرات النظام والتلميحات OPTION .

الاستعلامات الموحدة مقابل قواعد بيانات SQL Server/الجداول الخارجية

يوفر U-SQL مصدر البيانات والجداول الخارجية بالإضافة إلى الاستعلامات المباشرة مقابل قاعدة بيانات Azure SQL. بينما لا يقدم Spark نفس تجريدات الكائنات، فإنه يوفر موصل Spark لقاعدة بيانات Azure SQL التي يمكن استخدامها للاستعلام عن قواعد بيانات SQL.

معلمات ومتغيرات U-SQL

المعلمات ومتغيرات المستخدم لها مفاهيم مكافئة في Spark ولغات الاستضافة الخاصة بها.

على سبيل المثال في Scala، يمكنك تعريف متغير باستخدام var الكلمة الأساسية :

var x = 2 * 3;
println(x)

يمكن تقسيم متغيرات نظام U-SQL (المتغيرات التي تبدأ ب @@) إلى فئتين:

  • متغيرات النظام القابلة للتثبيت التي يمكن تعيينها إلى قيم معينة للتأثير على سلوك البرامج النصية
  • متغيرات النظام المعلوماتية التي تستفسر عن معلومات النظام ومستوى الوظيفة

معظم متغيرات نظام settable ليس لها مكافئ مباشر في Spark. يمكن تصميم بعض متغيرات النظام المعلوماتي عن طريق تمرير المعلومات كوسيطات أثناء تنفيذ المهمة، وقد يكون للبعض الآخر وظيفة مكافئة في لغة استضافة Spark.

تلميحات U-SQL

يقدم U-SQL عدة طرق بناء لتوفير تلميحات لمحسن الاستعلام ومحرك التنفيذ:

  • تعيين متغير نظام U-SQL
  • عبارة OPTION مقترنة بتعبير مجموعة الصفوف لتوفير بيانات أو تلميح خطة
  • تلميح صلة في بناء جملة تعبير الصلة (على سبيل المثال، BROADCASTLEFT)

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

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