تحويل البيانات باستخدام الروابط وعوامل المجموعة
غالبا ما تتطلب سير العمل في هندسة البيانات دمج المعلومات من مجموعات بيانات متعددة. تقوم الروابط بدمج الجداول أفقيا عن طريق مطابقة الصفوف على الأعمدة المرتبطة، بينما تجمع عوامل المجموعات الجداول عموديا عن طريق إضافة أو تقاطع أو استبعاد الصفوف. فهم متى تستخدم كل نهج يساعدك على بناء خطوط تحويل فعالة.
في هذه الوحدة، تتعلم كيفية دمج الجداول بناء على العلاقات وتطبيق عوامل المجموعات لدمج مجموعات البيانات مع المخططات المتطابقة.
جداول الدمج مع الروابط
ينضم الصفوف من جدولين بناء على عمود ذي صلة. نوع الانضمام يحدد الصفوف التي تظهر في النتيجة وكيفية التعامل مع الصفوف غير المتطابقة.
فهم أنواع الانضمام
كل نوع من الانضمام يخدم غرضا محددا في تحويل البيانات:
| نوع الانضمام | Description | حالة الاستخدام |
|---|---|---|
INNER |
يعيد فقط صفوف مطابقة من كلا الجدولين | ربط الطلبات مع العملاء الصحيحين |
LEFT |
يعيد جميع صفوف الجدول اليسرى؛ تضيف قواعد NULL للجدول الأيمن عندما لا يوجد تطابق | أدرج جميع العملاء، حتى بدون طلبات |
RIGHT |
يرجع جميع صفوف الجدول اليمنى؛ تضيف NULLs للجدول الأيسر عندما لا يوجد تطابق | يشمل جميع الأقسام، حتى بدون موظفين |
FULL |
يعيد جميع الصفوف من كلا الجدولين؛ يضيف NULLs لغير المتطابقين | دمج مجموعات البيانات لإيجاد الفجوات على كلا الجانبين |
SEMI |
يرجع صفوف الجدول الأيسر التي تحتوي على تطابقات في الجدول الأيمن | تصفية العملاء الذين وضعوا طلبات |
ANTI |
يرجع صفوف الجدول الأيسر التي لا يوجد لها تطابق في الجدول الأيمن | ابحث عن عملاء لم يقدموا طلبات من قبل |
CROSS |
يعيد حاصل ضرب ديكارتي لجميع الصفوف | توليد جميع التركيبات الممكنة |
ربط الجداول باستخدام SQL
تجمع الجملة JOIN الجداول بناء على شرط محدد مع ON أو USING. فكر في جداول الموظفين والأقسام التي تريد فيها مطابقة الموظفين مع أقسامهم:
-- Inner join: only employees with matching departments
SELECT e.id, e.name, e.deptno, d.deptname
FROM employee e
INNER JOIN department d ON e.deptno = d.deptno;
الوصلة الداخلية تعيد فقط ثلاثة صفوف — أي موظفون توجد أرقام أقسامهم في جدول الأقسام. الموظفون في الأقسام 4 و5 و6 لا يظهرون لأن تلك الأقسام ليست في جدول الأقسام.
عندما تحتاج إلى تضمين جميع الموظفين بغض النظر عن مطابقات الأقسام، استخدم الربط الأيسر:
-- Left join: all employees, NULL for missing departments
SELECT e.id, e.name, e.deptno, d.deptname
FROM employee e
LEFT JOIN department d ON e.deptno = d.deptno;
هذا يعيد جميع الموظفين الستة. أما الذين لا يوجد أقسام مطابقة فيظهرون deptname NULL في العمود.
انضم إلى DataFrames مع PySpark
طريقة PySpark join() توفر نفس الوظيفة. يحدد المعامل how نوع الانضمام:
df_employee = spark.table("employee")
df_department = spark.table("department")
# Inner join
df_inner = df_employee.join(
df_department,
on=df_employee.deptno == df_department.deptno,
how="inner"
)
display(df_inner)
بالنسبة للروابط الخارجية اليسرى أو اليمنى أو الكاملة، غير how المعامل:
# Left join: keep all employees
df_left = df_employee.join(
df_department,
on="deptno",
how="left"
)
# Full outer join: keep all rows from both tables
df_full = df_employee.join(
df_department,
on="deptno",
how="full"
)
عندما يحمل عمود الانضمام نفس الاسم في كلا الإطار البياني، قم بتمرير اسم العمود كسلسلة نصية. هذا النهج يتجنب الأعمدة المكررة في النتيجة.
تصفية البيانات باستخدام الوصلات شبه الدقيقة والمضادة
ال semi وanti joins قويان لتصفية البيانات بناء على وجودها في جدول آخر. الانضمام الجزئي يعيد صفوفا من الجدول الأيسر تحتوي على مطابقات، دون تضمين أعمدة من الجدول الأيمن:
-- Find employees who belong to listed departments
SELECT *
FROM employee
LEFT SEMI JOIN department ON employee.deptno = department.deptno;
الانضمام المضاد يعطي العكس — صفوف بدون مطابقات:
-- Find employees in departments not listed
SELECT *
FROM employee
LEFT ANTI JOIN department ON employee.deptno = department.deptno;
في PySpark، استخدم how="semi" أو how="anti":
# Employees with matching departments
df_semi = df_employee.join(df_department, on="deptno", how="semi")
# Employees without matching departments
df_anti = df_employee.join(df_department, on="deptno", how="anti")
دمج الصفوف مع عوامل المجموعات
تعمل عوامل المجموعات عموديا، حيث تجمع بين الصفوف من الاستعلامات ذات نفس هيكل الأعمود. على عكس الانضمامات، لا تتطابق عوامل المجموعات على شروط—بل تكدس أو تقارن مجموعات النتائج بالكامل.
فهم مؤثرات المجموعات
يدعم Azure Databricks ثلاثة مشغلات مجموعة:
| المشغل | Description | Behavior |
|---|---|---|
UNION |
يجمع بين الصفوف من كلا الاستعلامات | تزيل النسخ المكررة بشكل افتراضي؛ كان يحتفظ ALL بها |
INTERSECT |
يرجع الصفوف الموجودة في كلا الاستعلامات | تظهر فقط صفوف متطابقة |
EXCEPT |
يرجع الصفوف من الاستعلام الأول غير موجود في الثاني | إزالة التكرارات بشكل افتراضي |
يجب أن يكون لكلا الاستعلامين نفس عدد الأعمدة ذات أنواع البيانات المتوافقة.
دمج مجموعات البيانات مع UNION
UNION يضيف صفوفا من استعلام إلى آخر. بشكل افتراضي، يزيل التكرارات:
-- Combine active and archived customers (no duplicates)
SELECT customer_id, name, email FROM active_customers
UNION
SELECT customer_id, name, email FROM archived_customers;
للحفاظ على جميع الصفوف بما في ذلك النسخ المكررة، استخدم UNION ALL:
-- Combine all rows, keeping duplicates
SELECT customer_id, name, email FROM active_customers
UNION ALL
SELECT customer_id, name, email FROM archived_customers;
استخدمها UNION ALL عندما تعلم أنه لا توجد نسخ مكررة أو عندما تكون النسخ ذات معنى. يؤدي ذلك بشكل أفضل لأنه يتجاوز خطوة إزالة التكرار.
في PySpark، يستخدم union() دمج DataFrames. لاحظ أن PySpark union() يتصرف كما UNION ALLلو — يحتفظ بالتكرارات:
df_active = spark.table("active_customers")
df_archived = spark.table("archived_customers")
# Combine both tables (keeps duplicates)
df_combined = df_active.union(df_archived)
# Remove duplicates if needed
df_distinct = df_active.union(df_archived).distinct()
ابحث عن الصفوف المشتركة مع INTERSECT
INTERSECT يعيد فقط الصفوف التي تظهر في كلا الاستعلامين. يساعد ذلك في تحديد البيانات المتداخلة:
-- Find customers in both active and archived tables
SELECT customer_id FROM active_customers
INTERSECT
SELECT customer_id FROM archived_customers;
يحدد هذا الاستعلام العملاء الذين يظهرون بطريقة ما في كلا الجدولين—وهو أمر مفيد لفحوصات جودة البيانات أو تحديد السجلات التي تحتاج إلى مطابقة.
استبعد الصفوف التي تحتوي على EXCEPT
EXCEPT يرجع الصفوف من الاستعلام الأول التي لا توجد في الثاني. يساعد ذلك في تحديد الثغرات أو السجلات الفريدة:
-- Find active customers not in the archived table
SELECT customer_id FROM active_customers
EXCEPT
SELECT customer_id FROM archived_customers;
يمكنك أيضا استخدامه MINUS كمرادف ل EXCEPT:
-- Same result using MINUS syntax
SELECT customer_id FROM active_customers
MINUS
SELECT customer_id FROM archived_customers;
مثل UNION، كلاهما INTERSECT وإزالة EXCEPT النسخ المكررة بشكل افتراضي. أضف ALL ذلك للحفاظ على النسخ عند الحاجة.
Tip
عند ربط عمليات المجموعة، تذكر أن لها INTERSECT أولوية أعلى من UNION و EXCEPT. استخدم الأقواس للتحكم في ترتيب التقييم.
اختر بين الروابط ومؤثرات المجموعات
يعتمد الاختيار بين الروابط والمؤثرات المجموعات على هدف التحويل الخاص بك. تجمع الروابط الأعمدة من الجداول ذات الصلة أفقيا، بينما تجمع عوامل المجموعات الصفوف عموديا.
استخدم الوصلات عندما تحتاج:
- إثراء السجلات بإضافة أعمدة من جداول ذات صلة
- سجلات المباريات بناء على العلاقات الرئيسية
- تصفية البيانات بناء على وجود جدول آخر (شبه انضمام/مضاد)
استخدم عوامل التعيين عندما تحتاج:
- إضافة سجلات من مصادر متعددة ذات مخططات متطابقة
- ابحث عن السجلات الشائعة عبر مجموعات البيانات
- تحديد السجلات الفريدة لمجموعة بيانات واحدة
كلا النهجين يشكلان أساس خطوط تحويل البيانات الفعالة. في الوحدة التالية، تستكشف كيفية تحميل البيانات المحولة إلى جداول الهدف ضمن كتالوج Unity.