Apache Spark / المتوسط: التوزيع وأدلة التنفيذ / الدرس 7
النوافذ وإزالة التكرار الحتمية
احتفظ بتفاصيل القراءات عند اختيار المراجعات المعتمدة وحساب قياسات طاقة مرتبة.
في هذه الصفحة
أهداف الدرس
- حدد تقسيم النافذة وترتيبها وإطارها كلّاً على حدة.
- اختر سجلاً فائزاً قابلاً لإعادة الإنتاج، لا نسخة مكررة اعتباطية.
تحفظ النافذة الصف الحالي في النتيجة
ينتج GROUP BY صفاً لكل مجموعة، بينما تضيف النافذة قيمة إلى كل صف تفصيلي. يحدد PARTITION BY site_id مجتمعاً تحليلياً مستقلاً، لا وعداً بتنظيم الأقسام المادية القائمة. يحدد الترتيب التسلسل داخل المجتمع، ويحدد الإطار الصفوف التي تسهم في التجميع. هذه قرارات مستقلة. وإذا كرر ربط سابق قراءة، فلا تصلح النافذة تلك المضاعفة. أثبت مستوى تفصيل المدخل والمراجعة المؤهلة قبل إضافة المجاميع التراكمية أو المقارنة بالرصد السابق. قد تبدو النتيجة منظمة مع احتوائها حقائق خاطئة.
اختر السجل المعتمد بترتيب تجاري
قد يمثل تكرار هوية القراءة تسليماً مكرراً أو مراجعة مصححة مشروعة. لا يعبر dropDuplicates على الهوية وحدها عن المراجعة التي يجب اعتمادها. يختار SQL أعلى source_version ثم source_record_id ثابتاً لإعادة الإنتاج. ولا يصلح فاصل التعادل إلا إذا كانت حمولات المراجعة المتساوية متكافئة وفق عقد المصدر؛ أما المتعارضة فتُعزل ولا يُختار إحداها بصمت. يعيد المثال r1 بطاقة3 وr2 بطاقة4، ولا يثبت تزايد إصدارات مصدر حقيقي أو وصول كل سجلاته.
WITH incoming AS (SELECT * FROM VALUES
('r1',1,'a',2),('r1',2,'b',3),('r2',1,'c',4)
AS t(reading_id,source_version,source_record_id,kwh)),
ranked AS (SELECT *, ROW_NUMBER() OVER (PARTITION BY reading_id
ORDER BY source_version DESC, source_record_id ASC) AS rn FROM incoming)
SELECT reading_id,kwh FROM ranked WHERE rn=1 ORDER BY reading_id;
reading_id | kwh
r1 | 3
r2 | 4
الصفان المعتمدان منطقياً r1=3 وr2=4. يحتاج ROW_NUMBER ترتيباً كاملاً صريحاً لاختيار قابل للإعادة.
حدّد هل يتراكم النظراء أم الصفوف المتسلسلة
لدفتر طاقة متسلسل، استخدم ROWS صريحاً وترتيباً كلياً. قد يمنح إطار RANGE المنطقي الافتراضي الصفوف المتعادلة في الترتيب المجموع المتراكم نفسه، وهو سؤال مختلف. يرتب المثال هويات فريدة لعزل الحساب:2 ثم5 ثم9. يتبع الترتيب الحقيقي عادة زمن الحدث وفاصل هوية ثابتاً. يضبط ORDER BY داخل OVER الحساب لا العرض؛ لذلك يرتب الاستعلام الخارجي أيضاً. ويظل المجموع على مراجعات غير صحيحة خاطئاً مهما صحت صياغة الإطار.
SELECT reading_id,kwh,SUM(kwh) OVER (ORDER BY reading_id
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS cumulative_kwh
FROM VALUES ('r1',2),('r2',3),('r3',4) AS r(reading_id,kwh)
ORDER BY reading_id;
reading_id | kwh | cumulative_kwh
r1 | 2 | 2
r2 | 3 | 5
r3 | 4 | 9
القيم التراكمية المستنتجة2 و5 و9. لم تُنفذ نافذة أو عملية فرز على Spark.
يعتمد السابق على تاريخ محدد
تقارن LAG وLEAD أرصاداً متجاورة مرتبة دون ربط ذاتي كامل. وقد يختلف ترتيب الوصول من ترتيب الحدث بعد عودة العدادات؛ فسمِّ التاريخ الذي يعيد التحليل بناءه. يختلف غياب الصف السابق عن وجوده بطاقة مجهولة ولو أعاد التعبير NULL للحالتين. وتختلف الرتب: يحفظ RANK التعادل مع فجوات وDENSE_RANK بدونهـا. يمنح ROW_NUMBER مواضع فريدة لكنه لا يحدد فائزاً ذا معنى دون حسم التعادل. اختبر الأوقات المكررة والتصحيحات المتأخرة والغياب، لا أوقاتاً مثالية متزايدة فقط.
نطاق النافذة قرار موارد أيضاً
قد تحتاج النافذة إعادة توزيع وفرز وفق مفاتيحها. وقد تركز نافذة عالمية بلا تقسيم العمل فتختنق؛ وحتى تقسيم المواقع لا يمنع ضخامة موقع يحوي معظم القراءات. اعرض الأعمدة اللازمة وصفِّ المجتمع قبل النافذة عندما يسمح المعنى. افحص الخطط وقياسات المهام المصرح بها قبل العلاج المادي. تتحقق الدورة من نماذج مراجعات وجمع صغيرة في Python فقط، ولا تبدأ محركاً أوshuffle أومنفذاً ولا تقدم قياس نوافذ.
الأخطاء الشائعة وإصلاحها
تُستبعد قراءة مصححة لصالح نسخة أقدم
- لماذا يحدث؟
- حُدد المفتاح دون ترتيب للمراجعة المعتمدة.
- كيف تصلحه؟
- رتب المراجعات بسياسة تعارض حتمية موثقة.
- كيف تتجنب تكراره؟
- اختبر مراجعات تصل بغير ترتيب وتعارضات الإصدار المتساوي.
تقفز المجاميع عند الأوقات المتعادلة
- لماذا يحدث؟
- اختلط إطار النظراء بتراكم الصفوف المتسلسلة.
- كيف تصلحه؟
- اختر ROWS وترتيباً كلياً عندما يُقصد دفتر متسلسل.
- كيف تتجنب تكراره؟
- ضمّن قيم ترتيب متعادلة في اختبارات القبول.
تصبح النافذة العالمية مهمة بطيئة واحدة
- لماذا يحدث؟
- ركز المجتمع التحليلي العمل دون تقسيم مناسب.
- كيف تصلحه؟
- راجع صلاحية تقسيم تجاري مستقل قبل الضبط.
- كيف تتجنب تكراره؟
- افحص توزيع النافذة وعرض البيانات.
اختبر فهمك
1. هل يضمن dropDuplicates(["reading_id"]) بقاء أعلى source_version؟
اعرض الحل المشروح
لا؛ لا يرمز سياسة الاختيار هذه. استخدم ترتيباً مراجعاً واحفظ دليل تعارض النسخ المتساوية مختلفة الحمولة. تحقق من السجلات المختارة ومحاسبة المصدر قبل الجمع؛ فقد يخفي عدد صحيح مراجعة خاطئة.
2. ما المجاميع المتسلسلة لقراءات2 و3 و4؟
اعرض الحل المشروح
هي2 و5 و9 وفق ROWS والترتيب المعلن. تحتاج الأوقات المتعادلة فاصل تعادل ثابتاً، ويحتاج العرض ترتيباً خارجياً. لا يثبت الحساب خطة التنفيذ المادية.
أهم ما تعلمته
- تحتاج إزالة التكرار سياسة اعتماد وتعارض تجارية.
- التقسيم التحليلي والترتيب والإطار والعرض خيارات مستقلة.