Apache Spark / الأساسي: أسس علاقية ذات أنواع / الدرس 5
الربط والتفصيل والبيانات المرجعية
أثرِ القراءات دون مضاعفة الطاقة أو فقد المواقع التي تنقص بياناتها المرجعية.
في هذه الصفحة
أهداف الدرس
- توقع عدد الصفوف من التفرّد الفعلي للمفاتيح.
- اختر الربط الخارجي وsemi وanti وفق المجتمع المطلوب.
يغير الربط معنى الصف الواحد
يمثل صف القراءة رصداً واحداً، ويصف صف الموقع موقعاً، ويمثل صف الفحص زيارة. ينشئ ربط قراءة بثلاثة فحوص ثلاثة صفوف نتيجة ما لم تُختزل العلاقة أولاً. ويضاعف جمع kwh بعد ذلك مساهمة القراءة ثلاثاً. لا يفرض Spark تلقائياً إعلان مفتاح أساسي على كل DataFrame من ملفات؛ فقول «يجب أن يكون المرجع فريداً» ليس دليلاً على تفرّده. تحقق من التفرّد عند مفتاح الربط والزمن الفعال المقصودين. قد يكون تعدد إصدارات جدول مرجعي تاريخي مشروعاً، لكنه يحتاج قاعدة صريحة لاختيار النسخة الحالية أو المناسبة زمنياً.
احسب مرجعاً مكرراً يدوياً
يعطي أول مثال SQL الموقع north تسميتَين مرجعيتَين عمداً. تظهر قراءته ذات2 كيلوواط ساعة مرتين بعد الربط الداخلي، فيصبح المجموع4. الصفان صحيحان وفق دلالات الاستعلام المكتوب، رغم خطأ نتيجة الأعمال. وليست DISTINCT على المجموع النهائي إصلاحاً مبرراً. اختر صف المرجع المعتمد قبل الربط، أو غيّر مستوى التفصيل إذا احتاج التقرير كل إصدار حقاً. يكشف مثال صغير صُمم لإظهار الخطأ العيب أوضح من إجمالي كبير يبدو معقولاً بالمصادفة.
WITH readings AS (SELECT * FROM VALUES ('north',2) AS r(site_id,kwh)),
sites AS (SELECT * FROM VALUES ('north','A'),('north','B') AS s(site_id,label))
SELECT r.site_id, r.kwh, s.label
FROM readings r JOIN sites s ON r.site_id=s.site_id
ORDER BY s.label;
site_id | kwh | label
north | 2 | A
north | 2 | B
ينتج صفان يحمل كل منهما kwh=2. هذا مثال منطقي لعدد الصفوف، لا مخرجات Spark مقاسة.
ضع شروط الاختياري في المرحلة المقصودة
يحفظ الربط الأيسر القراءات التي لا تطابق موقعاً، ويضع NULL في الحقول المرجعية. وقد يحذف WHERE لاحق على علم active في اليمين تلك الصفوف غير المطابقة، فيحوّل السؤال فعلياً إلى اشتراط تطابق. قرر هل تبقى المواقع المجهولة في تقرير اكتمال، أم تُعزل، أم تُستبعد عمداً. لا تدع إعادة كتابة للأداء تقرر السياسة عرضياً. أهّل أسماء الأعمدة المشتركة، واعرض المفتاح المقصود مرة واحدة لتجنب الالتباس. ويختلف شكل أعمدة الربط بقائمة أسماء مفاتيح مشتركة عن الربط بتعبير عام، حتى لو تساوت أهلية الصفوف.
استخدم شبه الربط أو المضاد لسؤال الوجود
إذا كان السؤال فقط عن قراءات بلا مرجع موقع، فإن left anti join يحدد المجتمع مباشرة، ولا يعيد أعمدة المرجع. ويختار left semi join القراءات ذات تطابق واحد على الأقل من دون تكرارها لكل صف مرجع مطابق. قد تتجنب هذه الصيغ نمط الربط ثم DISTINCT الذي يخفي عيوب البيانات. يفترض مقطع PySpark DataFrames موجودة في مختبر، ويحفظ أعمدة القراءات فقط. وهو غير قابل للتشغيل. وتحتاج المفاتيح NULL قاعدة مستقلة؛ فالمساواة العادية لا تطابق هويتَي موقع غائبتين.
unmatched = readings.join(sites.select('site_id'), ['site_id'], 'left_anti')
matched_once = readings.join(sites.select('site_id'), ['site_id'], 'left_semi')
يحفظ كل ناتج مستوى تفصيل القراءة اليسرى. ولا يثبت semi أن جدول المواقع فريد.
اختر الاستراتيجية المادية بعد مراجعة المعنى
قد يستخدم Spark استراتيجيات بث أوتجزئة مع shuffle أودمج بعد الفرز، بحسب البيانات والإحصاءات والتكوين والتنفيذ المتكيف. لا يصلح تلميح البث تكرار مفاتيح المرجع، وقد يضغط الذاكرة إذا كبرت العلاقة. أثبت عقد الصف أولاً، ثم افحص خطة مصرحاً بها وقياسات تشغيل ممثلة. وتحتاج تحديثات المرجع سياسة اتساق للدفعة كي لا ترى أقسام مختلفة نتائج بحث خارجي غير منسقة. فضّل صورة مرجعية موثقة على طلب شبكة لكل قراءة. لا تشغل الدورة محرك ربط أو بثاً أو طلب شبكة أو قياساً موزعاً.
الأخطاء الشائعة وإصلاحها
تزداد الطاقة بعد الإثراء
- لماذا يحدث؟
- المفتاح المرجعي غير فريد عند مستوى تفصيل الربط.
- كيف تصلحه؟
- اختر الصفوف المرجعية أو جمّعها وفق قاعدة موثقة قبل الربط.
- كيف تتجنب تكراره؟
- تحقق من تفرّد المرجع، وطابق الطاقة قبل الإثراء وبعده.
تختفي المواقع المجهولة من تقرير الاكتمال
- لماذا يحدث؟
- رفض شرط في الجانب الأيمن صفوف NULL التي حفظها الربط الخارجي.
- كيف تصلحه؟
- ضع شروط الجانب الاختياري في مرحلة الربط أو التصنيف المقصودة.
- كيف تتجنب تكراره؟
- اختبر قراءة لا تطابق أي موقع.
AMBIGUOUS_REFERENCE
- لماذا يحدث؟
- لم يُحسم اسم عمود مشترك بعد الربط.
- كيف تصلحه؟
- أهّل الأسماء المستعارة، واعرض مخطط مخرج مقصوداً.
- كيف تتجنب تكراره؟
- راجع ملكية أعمدة المخرج مع شروط الربط.
اختبر فهمك
1. تطابق قراءة طاقتها2 كيلوواط ساعة ثلاثة صفوف تاريخ للموقع. ما مساهمتها في جمع الربط الخام؟
اعرض الحل المشروح
ستة كيلوواط ساعة؛ وهي مضاعفة ناتجة عن الربط لا طاقة جديدة. احسم اختيار الصف التاريخي، أو جمّع عند التفصيل الصحيح قبل الربط. طابق هويات القراءات والطاقة الإجمالية معاً حتى لا تخفي أخطاء متعاكسة العيب.
2. هل يثبت left semi join تفرّد مفتاح المرجع؟
اعرض الحل المشروح
لا. يحفظ الصف الأيسر مرة إذا وُجد تطابق واحد على الأقل، حتى لو احتوى اليمين عدة مطابقات. تحقق من التفرّد مستقلاً عندما يعتمد الإثراء اللاحق على تسمية معتمدة واحدة. استخدم semi لأسئلة الوجود، لا إصلاحاً خفياً لمرجع مكسور.
أهم ما تعلمته
- تبدأ صحة الربط بمستوى التفصيل الفعلي وأدلة المفاتيح.
- لا يصلح ضبط الربط المادي عقد علاقة خاطئاً.