حل التكرارات والانطلاع
مشاكل جودة البيانات مثل السجلات المكررة والقيم الصفرية يمكن أن تؤثر على تحليلاتك والعمليات التالية. سواء ظهرت التكرارات من أحمال بيانات متزامنة أو ظهرت نقاط فراغ بسبب بيانات المصدر غير المكتملة، فإن معالجة هذه المشكلات هي مسؤولية أساسية لمهندسي البيانات العاملين في Azure Databricks.
في هذه الوحدة، تتعلم كيفية تحديد وحل القيم المكررة والمفقودة والفارغة باستخدام كل من نهجي SQL وPySpark.
تحديد السجلات المكررة
قبل أن تتمكن من إزالة النسخ المكررة، عليك أن تجدها. تحدث التكرارات عادة عندما يظهر نفس السجل عدة مرات في الجدول، وغالبا بسبب مشاكل تكامل البيانات، أو تكرار الاستيعاب، أو عمليات كتابة متزامنة.
استخدم GROUP BY واضطرار للعثور على النسخ المكررة
أسهل طريقة لتحديد التكرارات هي تجميع السجلات وعد الظواهر. تقوم الجملة HAVING بتصفية النتائج المجمعة لتظهر فقط القيم التي تظهر أكثر من مرة.
SELECT
customer_id,
email,
COUNT(*) AS occurrence_count
FROM sales.customers
GROUP BY customer_id, email
HAVING COUNT(*) > 1
ORDER BY occurrence_count DESC;
هذا الاستعلام يعيد جميع التركيبات من customer_id و email التي تظهر عدة مرات في الجدول، مما يساعدك على فهم نطاق التكرار.
استخدم QUALIFY مع وظائف النافذة
توفر الجملة QUALIFY نهجا أكثر أناقة من خلال تصفية نتائج دوال النافذة مباشرة، دون الحاجة إلى استعلامات فرعية. هذه الطريقة مفيدة بشكل خاص عندما تحتاج لرؤية الصفوف المكررة فعليا، وليس فقط الأعداد.
SELECT *
FROM sales.customers
QUALIFY COUNT(*) OVER (PARTITION BY customer_id, email) > 1;
قد يعطي هذا الاستعلام نتائج مثل:
| customer_id | البريد الإلكتروني | الاسم | created_at | حالة |
|---|---|---|---|---|
| 1001 | jane@contoso.com | جين دو | 2024-01-15 | نشط |
| 1001 | jane@contoso.com | جين دي. | 2024-03-20 | نشط |
| 1002 | bob@fabrikam.com | بوب سميث | 2024-02-10 | معلق |
| 1002 | bob@fabrikam.com | روبرت سميث | 2024-02-11 | نشط |
مع هذا النمط، تحصل على جميع الأعمدة من الصفوف المكررة، مما يسهل عليك التحقيق في مصدر التكرار.
ابحث عن النسخ المكررة باستخدام PySpark
في PySpark، يمكنك استخدام وظائف النوافذ مع التصفية لتحديد السجلات المكررة:
from pyspark.sql.functions import count
from pyspark.sql.window import Window
window_spec = Window.partitionBy("customer_id", "email")
duplicates_df = (
df.withColumn("row_count", count("*").over(window_spec))
.filter("row_count > 1")
.drop("row_count")
)
display(duplicates_df)
بدلا من ذلك، استخدم الطريقة exceptAll() لمقارنة DataFrame الأصلي مع نسخة غير مكررة:
df_duplicates = df.exceptAll(df.dropDuplicates(["customer_id", "email"]))
display(df_duplicates)
تقوم الطريقة exceptAll() بعمل فرق مجموعة يحافظ على النسخ المكررة. يعيد جميع الصفوف من DataFrame الأول التي ليست في DataFrame الثاني، مع الحفاظ على تكرار الظواهر. إليك كيفية عمل هذا:
-
df.dropDuplicates(["customer_id", "email"])ينشئ إطار بيانات يحتوي على صف واحد لكل تركيبة فريدة -
exceptAll()يقارن DataFrame الأصلي مع هذه النسخة غير المكررة - لكل تركيبة فريدة، يتم "مطابقة" وإزالة تكرار واحد، مما يترك فقط النسخ الإضافية
على سبيل المثال، إذا ظهر العميل 1001 ثلاث مرات في DataFrame الأصلي ومرة واحدة في النسخة غير المكررة، exceptAll() فإنه يعيد صفين (التكرار الإضافي).
Note
على عكس except()، التي تزيل جميع الصفوف المتطابقة وتعيد نتائج مميزة، exceptAll() تحافظ على البنية المكررة. إذا كان لديك ثلاثة صفوف متطابقة في الأصل وواحد في المجموعة غير المكررة، exceptAll() فإنه يعطي بالضبط صفين.
إزالة السجلات المكررة
بمجرد تحديد التكرارات، يمكنك اختيار استراتيجية حل بناء على متطلبات بياناتك.
إزالة النسخ في PySpark
تقوم الطريقة dropDuplicates() بإزالة الصفوف المكررة بناء على الأعمدة المحددة، مع الاحتفاظ فقط بالظهور الأول:
df_clean = df.dropDuplicates(["customer_id", "email"])
لإزالة تكرار الصفوف بالكامل عبر جميع الأعمدة، استخدم distinct():
df_unique = df.distinct()
احتفظ بصفوف محددة باستخدام ROW_NUMBER
عندما تحتاج إلى التحكم في أي نسخة مكررة تحتفظ بها، استخدم ROW_NUMBER() مع QUALIFY لاختيار السجلات بناء على معايير مثل التحديث الأخير:
SELECT *
FROM sales.customers
QUALIFY ROW_NUMBER() OVER (
PARTITION BY customer_id
ORDER BY updated_at DESC
) = 1;
يقوم هذا الاستعلام بتقسيم السجلات حسب customer_id، ويرتبها updated_at بترتيب تنازلي، ويحتفظ فقط بأحدث سجل لكل عميل.
التعامل مع القيم الصفرية والمفقودة
تمثل القيم الصفرية بيانات مفقودة أو غير معروفة. اعتمادا على متطلبات التحليل لديك، قد تحتاج إلى إزالة الصفوف التي تحتوي على نقاط فارغة، أو استبدالها بالقيم الافتراضية، أو استخدام النسبة الإحصائية.
تحديد القيم الصفرية
استخدم الدالة isnull() أو IS NULL العامل للعثور على سجلات ذات قيم مفقودة:
SELECT *
FROM sales.transactions
WHERE amount IS NULL
OR customer_id IS NULL;
لعد الظواهر الفارغة لكل عمود:
SELECT
COUNT(*) AS total_rows,
COUNT(*) - COUNT(amount) AS null_amount_count,
COUNT(*) - COUNT(customer_id) AS null_customer_count
FROM sales.transactions;
إسقاط صفوف ذات قيم فارغة
في PySpark، تزيل الطريقة dropna() الصفوف التي تحتوي على قيم فارغة:
# Drop rows where any column is null
df_clean = df.dropna()
# Drop rows where all columns are null
df_clean = df.dropna(how="all")
# Drop rows where specific columns are null
df_clean = df.dropna(subset=["customer_id", "amount"])
يتحكم المعامل how في السلوك: "any" يسقط صفوفا تحتوي على صفوف ذات صفور واحد على الأقل (افتراضي)، بينما "all" يسقط الصفوف فقط عندما تكون جميع الأعمدة المحددة فارغة.
املأ القيم الصفرية بالإعدادات الافتراضية
تستبدل الطريقة fillna() القيم الصفرية بإعدادات افتراضية محددة:
# Fill all null values with a single value
df_filled = df.fillna(0)
# Fill specific columns with different values
df_filled = df.fillna({
"amount": 0,
"status": "Unknown",
"quantity": 1
})
في SQL، استخدم الدالة COALESCE لتوفير القيم الافتراضية:
SELECT
customer_id,
COALESCE(amount, 0) AS amount,
COALESCE(status, 'Unknown') AS status
FROM sales.transactions;
اختر الاستراتيجية المناسبة
تعتمد استراتيجية التعامل مع الصفر المناسبة على سياق بياناتك:
| السينَاريو | النهج الموصى به |
|---|---|
| النقاط الصفرية في الحقول المطلوبة مثل المعرفات | اترك الصفوف |
| الصفريات في الحقول العددية للتجميع | ملء بالصفر أو المتوسط |
| الفروج في الحقول الفئوية الاختيارية | املأ بكلمة مؤقتة مثل "غير معروف" |
| النقاط الصفرية التي قد تشوه التحليل | الحذف أو التعبئة بناء على معرفة المجال |
Tip
وثق قراراتك في التعامل مع الصفر. يحتاج المحللون المستقبليون إلى فهم سبب استبدال أو إزالة بعض القيم لتفسير نتائج الاستعلام بشكل صحيح.
فهم كيفية تحديد وحل هذه المشكلات في جودة البيانات يؤهلك لبناء خطوط معالجة بيانات أكثر موثوقية. مع البيانات النظيفة، تنتج تحولاتك وتحليلاتك لاحقا نتائج موثوقة.