محتويات الدورة

Apache Spark / المتوسط: التوزيع وأدلة التنفيذ / الدرس 12

دوال Python وArrow وعقود العمليات العاملة

وسّع التحويلات عند الحاجة فقط، واحفظ دلالات النوع وNULL والتبعيات والإعادة عبر عمليات Python.

وقت القراءة التقريبي: 4 دقيقةتاريخ مراجعة المحتوى
في هذه الصفحة

أهداف الدرس

  • فضّل التعبير الأصلي المدعوم إذا عبّر عن القاعدة.
  • ميّز UDF المفردة والتنفيذ المتجهي واختبار الدالة المحلية النقية.

أظهر قاعدة المجال البسيطة للمحسّن

يمكن التعبير عن تصنيف قراءة وفق NULL والإشارة مباشرة بـwhen ومقارنات الأعمدة. يُظهر التعبير الأصلي البنية لمحرك SQL ويتجنب تسلسل Python غير اللازم. لا يعني ذلك أن كل دالة Python بطيئة أوكل تعبير أصلي مجاني؛ اختر من وضوح المعنى والتكلفة المقاسة. يفترض المقطع kwh رقمية محللة مسبقاً، فلا يحلل النصوص أويتحقق من الوحدات. أبقِ تلك الحدود السابقة صريحة، فقد يخفي اسم classify واحد عقوداً مختلفة.

python مثال تقني توضيحي؛ النتائج المنطقية مستنتجة ولم تُختبر على المحرك.
from pyspark.sql import functions as F
classified = readings.withColumn('quality',
    F.when(F.col('kwh').isNull(), F.lit('missing'))
     .when(F.col('kwh') < 0, F.lit('negative'))
     .otherwise(F.lit('known'))) 

للقيم ذات الأنواع None و-1 و0 تكون التسميات missing وnegative وknown منطقياً. لم يُنفذ تعبير Spark.

تعبر UDF في Python حدود بيئة تنفيذ

تتلقى UDF المفردة قيماً وتعيدها وفق نوع Spark معلن، وتعمل في عمليات Python عاملة. لا تنتقل حزم وملفات المشغّل المثبتة تلقائياً إلى كل مكان. يصبح التسلسل وإصدار Python وبيئة العامل وتحويل البيانات جزءاً من الواجهة. وقد يرسل التقاط كائن مشغّل كبير بيانات غير مقصودة أويفشل التسلسل. لا تستخدم جلسة Spark للمشغّل داخل العامل، ولا تفتح اتصال قاعدة بعيداً لكل قراءة. اجعل المنطق حتمياً واعياً بـNULL ومعزولاً عن الآثار قبل تغليفه للتوزيع.

اختبر الدالة محلياً دون ادعاء اختبار Spark

تصنف الدالة النقية أدناه أرقاماً أوNone فقط. يمكن اختبار سلوك Python بأمان دون استيراد PySpark. أما غلاف udf المنفصل فمقطع منصة غير قابل للتشغيل. ولا ينبغي قبول نص أوكائن خارج العقد صامتاً كقياس صالح. يثبت التأكيد المحلي منطق الفروع، لا تسلسل Spark أوتحويل نوع الإرجاع أوتغليف العامل. ميّز نطاقات التحقق في التقارير، خصوصاً عندما يغير Arrow الاختياري سلوك التحويل.

python مثال تقني توضيحي؛ النتائج المنطقية مستنتجة ولم تُختبر على المحرك.
def classify_numeric(value):
    if value is None:
        return 'missing'
    return 'negative' if value < 0 else 'known'

# Platform wrapper, not executed here:
classify_udf = F.udf(classify_numeric, 'string')

تُختبر classify_numeric وحدها محلياً بالمكتبة القياسية. يحتاج F.udf بيئة Spark ولم يُنفذ.

لا يلغي النقل المتجهي العقود الدلالية

تعالج Pandas UDFs دفعات مدعومة عبر Arrow، بينما تمثل الدوال المفردة المحسنة بـArrow آلية موثقة مختلفة. قد يقلل النقل الدفعي الكلفة لكنه يحتاج تبعيات اختيارية متوافقة وأشكال مدخل ومخرج معلنة. وقد تحمّل العمليات المجمعة مجموعات كبيرة في ذاكرة Python؛ فلا يضمن شكل API الدفعي ذاكرة محدودة لكل نمط. اختبر تحويل المناطق الزمنية والأعداد nullable والعشري والمتداخل بأمثلة ممثلة. لا تثبت pandas أوArrow لمجرد تسمية مثال غير منفذ مختبراً. لا تجري الدورة تحويل Arrow أوتشغيل عامل أوتثبيت تبعيات خارجية.

تحتاج أخطاء العامل السبب الأصلي ونطاق المدخل

قد يظهر استثناء Python داخل إخفاق مهمة موزعة بأثر تغليف أطول. احفظ نوع الاستثناء الأصلي وأصغر مدخل اصطناعي معتمد يعيده. تختلف الحزمة الغائبة من عدم تطابق نوع الإرجاع أوNULL غير متوقعة. راجع الإعادة قبل إضافة تسجيل أوطلبات خارجية للدالة، فقد يُقيّم الصف أكثر من مرة. قارن نتائج الأصلية وUDF على حالات حدود كاملة قبل تجارب الأداء. لا يدعي الدرس مقارنة محرك أوسرعة؛ بل يتحقق من نموذج التصنيف المحلي فقط.

الأخطاء الشائعة وإصلاحها

لا يستطيع العامل استيراد حزمة موجودة في المشغّل فقط

لماذا يحدث؟
افتُرض تطابق بيئتَي Python للمشغّل والمنفذ.
كيف تصلحه؟
استخدم تغليف عامل معتمداً وقابلاً للإعادة للنشر.
كيف تتجنب تكراره؟
سجّل توافق Python والتبعيات مستقلاً عن مصدر التطبيق.

يُعرض اختبار دالة محلية كاختبار UDF موزع

لماذا يحدث؟
اختلط اختبار المنطق بالتسلسل وتشغيل العامل.
كيف تصلحه؟
سمِّ الحد المختبر، ونفذ فحوص المحرك فقط بمختبر مصرح.
كيف تتجنب تكراره؟
افصل أدلة الاختبار المحلية والمنصية.

تستنفد دالة متجهية مجمعة ذاكرة Python

لماذا يحدث؟
عوملت مجموعة كبيرة كدفعة محدودة آمنة.
كيف تصلحه؟
افحص أحجام المجموعات واختر معالجة محدودة صحيحة.
كيف تتجنب تكراره؟
اختبر مجموعات المفاتيح الساخنة وعقود شكل الإرجاع.

اختبر فهمك

1. ماذا تعيد classify_numeric للقيم None و-1 و0؟

اعرض الحل المشروح

تعيد missing وnegative وknown. هذه نتائج فروع Python محلية للمجال المعلن، ولا تثبت تسلسل غلاف UDF أومخطط Spark المعاد. احتفظ باختبار محرك مستقل مصرح به عند لزوم التكامل.

2. لماذا يُفضّل when الأصلي لقاعدة الإشارة البسيطة؟

اعرض الحل المشروح

يعبّر عن القاعدة داخل SQL ويتجنب حد Python غير اللازم. تحقق مع ذلك من NULL والأرقام وقارن تكلفة ممثلة عند الحاجة. ليس الاختيار منعاً عاماً للدوال المخصصة عندما تعجز الأصلية عن التعبير الواضح.

أهم ما تعلمته

  • تضيف UDF عقود نوع وبيئة وإعادة فوق المنطق المحلي.
  • لـArrow والاختبارات المحلية حدود تحقق محددة بدقة.

المراجع الرسمية