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

Apache Spark / الأساسي: أسس علاقية ذات أنواع / الدرس 3

تعبيرات الأعمدة وNULL وسلوك ANSI

اجعل القياسات الغائبة والمعيبة صريحة، بدلاً من إخفائها داخل التحويلات أو تحكم Python.

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

أهداف الدرس

  • استخدم المنطق ثلاثي القيم والمساواة الآمنة مع NULL عمداً.
  • اشرح إخفاقات ANSI في Spark4 والتحويل المتسامح المصحوب بمحاسبة المرفوضات.

العمود تعبير موزع

في PySpark، يصف Column كيفية حساب قيمة لصفوف أثناء التنفيذ؛ وليس قيمة Python مفردة متاحة فوراً في المشغّل. استخدم دوال Spark وعوامل الأعمدة لبناء التعبير. لا تستطيع if في Python اتخاذ قرار مستقل لكل صف موزع، ولا يجمع and أوor شروط Column بالطريقة المقصودة. تبني التعبيرات المحاطة بأقواس باستخدام العوامل البتية المدعومة شروطاً منطقية. وتوفر تعبيرات SQL مساراً واضحاً آخر. أبقِ الوحدات وسلوك NULL ظاهرين في الواجهتين؛ فقد يحول تعبير صحيح صياغياً قراءة مجهولة إلى صفر مقبول ومضلل.

المجهول يختلف عن الخطأ المنطقي

تعطي المساواة العادية مع NULL نتيجة مجهولة، ولا تحتفظ التصفية إلا بالنتائج الصحيحة. يعامل عامل المساواة الآمنة <=> في Spark قيمتَي NULL متساويتين، ويعد NULL مع قيمة معلومة مختلفتين. استخدمه لمقارنة قيم اختيارية لسبب تجاري مقصود، لا بديلاً لكل مساواة مفاتيح الربط. وينبغي عادة رفض هوية موقع غائبة، لا تجميعها كموقع يبدو صالحاً. يكشف الاستعلام الأول القواعد بتعبيرات محلية، ويعيد صف نتائج مستنتجاً واحداً. لم يُشغّل مفسر Spark SQL.

sql مثال تقني توضيحي؛ النتائج المنطقية مستنتجة ولم تُختبر على المحرك.
SELECT
 CASE WHEN NULL = NULL THEN 'true' ELSE 'not true' END AS ordinary,
 NULL <=> NULL AS both_missing,
 7 <=> NULL AS one_missing;
الناتج المتوقع
ordinary | both_missing | one_missing
not true | true         | false

تكون ordinary بالقيمة not true لأن المقارنة مجهولة؛ وتكون نتيجتا المساواة الآمنة true وfalse.

يغير Spark4 حد الإخفاق الافتراضي

يفعّل Spark 4.0 الإعداد spark.sql.ansi.enabled افتراضياً. لذلك قد ترفع التحويلات المعيبة والفيض الحسابي أخطاء كانت مسارات المعالجة الأقدم تتوقع تحويلها إلى NULL أو تحملها بطريقة أخرى. تعامل مع التغير كمراجعة لعقد البيانات، لا سبب لتعطيل ANSI تلقائياً. قد تشير قراءة معيبة إلى خلل في المنتج أو رأس ملف قُرئ كبيانات أو تغير وحدة. افحص فئة الخطأ الدقيقة والتعبير وقيمة المصدر من أدلة محجوبة ومعتمدة. واحفظ افتراضات التكوين مع الوظيفة، حتى لا يغير تجاوز منصة مدارة معنى النتيجة الناجحة بصمت.

يجب أن يترك التحويل المتسامح أثراً

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

sql مثال تقني توضيحي؛ النتائج المنطقية مستنتجة ولم تُختبر على المحرك.
SELECT raw_kwh, try_cast(raw_kwh AS DECIMAL(10,3)) AS parsed_kwh
FROM VALUES ('1.250'), ('offline') AS incoming(raw_kwh);
الناتج المتوقع
raw_kwh | parsed_kwh
1.250   | 1.250
offline | NULL

القيم المحللة المستنتجة هي1.250 وNULL. ويجب أن يظل نص المصدر offline متاحاً للتشخيص.

التعويض قرار مجال

تختار coalesce أول تعبير غير NULL. يحول تعويض كل kwh غائبة بصفر معنى «طاقة مجهولة» إلى «إنتاج معلوم معدوم»، وقد يشوه تقرير أداء الطاقة الشمسية. قد يحتاج انقطاع الحساس علامة يوم غير مكتمل بدلاً من رقم بديل. تستطيع CASE أوwhen تصنيف السجلات المعلومة والغائبة والمعيبة قبل التجميع. استخدم فروعاً متوافقة عشرياً لتجنب توسيع نوع أو تحويل ضمني عرضي. ثبّت مفردات التصنيف بين المستهلكين، واختبر الحدود ومنها الصفر والسالب والقيم القريبة من حدود الدقة المعلنة. كل النتائج المتوقعة أمثلة منطقية لا قياسات محرك.

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

CAST_INVALID_INPUT

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

ARITHMETIC_OVERFLOW

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

يرفض تقييم Python المنطقي كائن Column

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

اختبر فهمك

1. هل coalesce(kwh,0) مجرد اختيار تنسيق غير مؤثر في تقرير انقطاع؟

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

لا. يغير الحقيقة الممثلة من إنتاج مجهول إلى إنتاج معلوم يساوي صفراً. احتفظ بالغياب وأبلغ الاكتمال مستقلاً، إلا إذا سمحت قاعدة مجال موثقة بالتعويض. اختبر مقام التجميع الناتج وإجماليه معاً.

2. ما الدليل الإضافي المطلوب إذا أعادت try_cast قيمة NULL؟

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

احفظ القيمة الأصلية، وصنّف هل كان المدخل غائباً أم فشل تحويله. عدّ كل فئة، واحتفظ بهوية المصدر للإصلاح. قد يبقي التعبير المتسامح الوظيفة عاملة، لكنه يفقد معنى القياس بصمت إذا أُهملت هذه الفئات.

أهم ما تعلمته

  • تحتاج القيمة الغائبة والقيمة غير الصالحة إلى نتيجتَي أعمال مختلفتين.
  • افتراضات ANSI جزء من عقد الإصدار المختار.

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