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

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

التصفية والمناطق الزمنية والترتيب الحتمي

عبّر عن فترة تقرير ومخرج حتمي، دون خلط لحظات الأحداث والساعات المحلية وترتيب الأقسام.

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

أهداف الدرس

  • استخدم حدود تاريخ ووقت ذات أنواع ونطاقات نصف مفتوحة.
  • اشرح منطقة الجلسة وأنواع timestamp والفرز الصريح.

يحتاج التقرير اليومي اصطلاح ساعة

لا تكتمل عبارة «طاقة1 أكتوبر» حتى تسمي التعاونية منطقة العمل الزمنية، وتوضح هل تمثل القراءات لحظات أم أوقات ساعة محلية. لا يكشف طابع مصدر بلا إزاحة منطقته الأصلية وحده. يدعم Spark دلالات timestamp ذي المنطقة الزمنية المحلية وtimestamp بلا منطقة، ويعتمد معنى الاسم الافتراضي TIMESTAMP على التكوين. سجل النوع المقصود ومنطقة الجلسة عند حدود الوظيفة، ولا تستنتجهما من الحاسوب الذي يعرض عينة. وقد يجعل انتقال التوقيت الصيفي يوماً تقويمياً محلياً مختلفاً عن أربع وعشرين ساعة منقضية بالضبط.

استخدم حداً علوياً غير مشمول

يستخدم مثال SQL قيماً من نوع DATE، فيختار1 أكتوبر ويستبعد2 أكتوبر بلا التباس تحليل timestamp. يسمح >= start و< end بتركيب فترات تقرير متجاورة دون عد الحد المشترك مرتين. يشمل BETWEEN الطرفين، وهو ما يخطئ غالباً عندما يكون منتصف ليل الغد حد الوقت الأعلى. تجنب تحويل event_time إلى نص لمجرد مقارنة تسمية يوم؛ فهذا يخلط العرض بالأهلية وقد يعيق تقليص قراءة المصدر. اشتق حدوداً ذات أنواع وفق الساعة الموثقة، ووحّدها بين المدخلات والتجميعات وتسميات أقسام المخرج.

sql مثال تقني توضيحي؛ النتائج المنطقية مستنتجة ولم تُختبر على المحرك.
SELECT reading_id, reading_day
FROM VALUES ('r1', DATE '2026-10-01'), ('r2', DATE '2026-10-02')
AS readings(reading_id, reading_day)
WHERE reading_day >= DATE '2026-10-01'
 AND reading_day < DATE '2026-10-02'
ORDER BY reading_id;
الناتج المتوقع
reading_id | reading_day
r1         | 2026-10-01

تتأهل r1 فقط. يستخدم المثال تواريخ تقويمية ولا يقرر سلوك timestamp مع المناطق الزمنية.

اجعل افتراض الوقت قابلاً للملاحظة

يمكن في جلسة PySpark مستقلة ومصرح بها فحص spark.sql.session.timeZone وضبطها عمداً وفق عقد الوظيفة. يوضح المقطع UTC المقصودة، لكنه لا يُنفذ. ولا يصلح نصوص مصدر وُسمت خطأ بأنها UTC. حلّل بتنسيقات صريحة، واحتفظ بالإزاحات أو بيانات منطقة المصدر عند الحاجة. تمثل TIMESTAMP_NTZ تاريخاً ووقتاً محليين من دون دلالات تحويل اللحظة؛ وقد تضيف مقارنتها بنوع لحظي تفسيراً ضمنياً. وحّد الأنواع، واختبر حدود التحويل، بدلاً من إخفاء اختلافاتها بتنسيق عرض نهائي.

python مثال تقني توضيحي؛ النتائج المنطقية مستنتجة ولم تُختبر على المحرك.
job_zone = 'UTC'
# Illustrative session configuration in an independent lab only:
spark.conf.set('spark.sql.session.timeZone', job_zone)
observed_zone = spark.conf.get('spark.sql.session.timeZone')

القيمة المقصودة التي ستُقرأ هي UTC. لا تغير الدورة أي إعداد جلسة.

ليس للصفوف الموزعة ترتيب عالمي ضمني

لا يعد DataFrame بترتيب ملفات الإدخال. يحدد orderBy ترتيباً عالمياً صريحاً للنتيجة، بينما يرتب sortWithinPartitions داخل كل قسم مادي فقط. عند تعادل event_time، أضف reading_id ثابتاً قبل تحديد عدد النتائج أو مقارنة التقارير. قد يعيد limit من دون ترتيب كلي مجموعة فرعية مختلفة وصحيحة بعد إعادة التقسيم أو تغيير الخطة. وتحتاج القيم الزمنية الغائبة إلى سياسة موضع NULL صريحة إذا ظلت مؤهلة. قد يستهلك فرز نتيجة كبيرة shuffle وذاكرة؛ فرتب فقط حيث يحتاج المستهلك، ولا تخلط معاينة مريحة بعقد نشر دائم.

احفظ صورة المدخل وسياسة الوقت معاً

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

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

CANNOT_PARSE_TIMESTAMP

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

يشمل تقرير اليوم منتصف ليل اليوم التالي

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

يتغير ترتيب المعاينة بعد إعادة التقسيم

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

اختبر فهمك

1. هل يضمن sortWithinPartitions أن تسبق كل القراءات المبكرة كل القراءات المتأخرة؟

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

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

2. لماذا يجب أن يسجل تقرير زمن الحدث حد الاستلام أيضاً؟

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

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

أهم ما تعلمته

  • معنى الساعة وحد المدخلات جزء من صحة التقرير.
  • يحتاج الترتيب العالمي إلى تعبير فرز كلي صريح.

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