فهم تعليمة 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 C# المضمنة العددية

لغة تعبير 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 for 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وsnotnull على التوالي (أو ما يعادلها 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، ، ANDOR وما إلى ذلك.

يوفر 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 التي يمكن تعيينها إلى قيم محددة للتأثير على سلوك البرامج النصية
  • متغيرات النظام المعلوماتي التي تستعلم عن معلومات النظام ومستوى الوظيفة

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

تلميحات U-SQL

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

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

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

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