فهم تعليمة Apache Spark البرمجية لمطوري U-SQL
هام
تم إيقاف Azure Data Lake Analytics في 29 فبراير 2024. تعرف على المزيد من خلال هذا الإعلان.
بالنسبة لتحليلات البيانات، يمكن لمؤسستك استخدام Azure Synapse Analytics أو Microsoft Fabric.
يوفر هذا القسم إرشادات عالية المستوى حول تحويل البرامج النصية U-SQL إلى Apache Spark.
- يبدأ بمقارنة نماذج معالجة اللغة
- يوفر تلميحات حول كيفية:
- تحويل البرامج النصية بما في ذلك تعبيرات مجموعة صفوف U-SQL
- رمز .NET
- أنواع البيانات
- كائنات الكتالوج
فهم لغة 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 نمط المعالجة التالي:
- تتم قراءة البيانات إما من الملفات غير المنظمة، باستخدام
EXTRACT
العبارة أو الموقع أو مواصفات مجموعة الملفات، والمخرج المضمن أو المعرف من قبل المستخدم والمخطط المطلوب، أو من جداول U-SQL (الجداول المدارة أو الخارجية). يتم تمثيله كمجموعة صفوف. - يتم تحويل مجموعات الصفوف في عبارات U-SQL متعددة تطبق تعبيرات U-SQL على مجموعات الصفوف وتنتج مجموعات صفوف جديدة.
- وأخيرا، يتم إخراج مجموعات الصفوف الناتجة في أي من الملفات باستخدام
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
/SEMI
JOIN
التعبيراتCROSS
/OUTER
APPLY
التعبيرات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 التي يمكن تعيينها إلى قيم محددة للتأثير على سلوك البرامج النصية
- متغيرات النظام المعلوماتي التي تستعلم عن معلومات النظام ومستوى الوظيفة
معظم متغيرات نظام settable ليس لها مكافئ مباشر في Spark. يمكن تصميم بعض متغيرات النظام المعلوماتي عن طريق تمرير المعلومات كوسيطات أثناء تنفيذ المهمة، وقد يكون للبعض الآخر وظيفة مكافئة بلغة استضافة Spark.
تلميحات U-SQL
يقدم U-SQL عدة طرق بناء لتوفير تلميحات لمحسن الاستعلام ومحرك التنفيذ:
- تعيين متغير نظام U-SQL
- عبارة
OPTION
مقترنة بتعبير مجموعة الصفوف لتوفير بيانات أو تلميح خطة - تلميح صلة في بناء جملة تعبير الصلة (على سبيل المثال،
BROADCASTLEFT
)
يحتوي محسن الاستعلام المستند إلى التكلفة في Spark على قدراته الخاصة لتوفير تلميحات وضبط أداء الاستعلام. راجع الوثائق المقابلة.
الخطوات التالية
- فهم تنسيقات بيانات Spark لمطوري U-SQL
- .NET لـ Apache Spark
- ترقية حلول تحليلات البيانات الضخمة من Azure Data Lake Storage Gen1 إلى Azure Data Lake Storage Gen2
- تحويل البيانات باستخدام نشاط Spark في Azure Data Factory
- تحويل البيانات باستخدام نشاط Hadoop Hive في Azure Data Factory
- ما هو Apache Spark في Azure HDInsight