كيفية إضافة أعمدة متعددة إلى إطار بيانات PySpark

دليل تقني مفصل يوضح المنهجيات والتقنيات البرمجية لإضافة أعمدة متعددة إلى إطار بيانات PySpark بكفاءة وتحليل أثرها على الأداء الحاسوبي.

Mohammed looti أكاديمي وباحث متخصص في علم النفس
تاريخ النشر
تمت المراجعة العلمية · د. مروة عبد العظيم · 28 أكتوبر، 2026
مراجعة وتدقيق علمي معتمد تاريخ التدقيق: 28 أكتوبر، 2026
د. مروة عبد العظيم دكتوراه في علم النفس
عضو هيئة التدريس • جامعة كربلاء
معايير التدقيق والاعتماد السريري

يخضع هذا المحتوى لمعايير ضبط الجودة والتدقيق العلمي والأكاديمي الصارمة في شبكة علم النفس العربي، لضمان صحة المعلومات ودقتها السريرية ومطابقتها لأحدث الأدلة والبراهين الصادرة عن الجمعيات النفسية والطبية المعتمدة (APA / WHO).

تتبوأ الحوسبة الموزعة مكانة الصدارة في هندسة البيانات الحديثة وتحليل النظم البيئية واسعة النطاق؛ حيث يواجه مهندسو ومحللو البيانات تحديات متزايدة تتعلق بإدارة أحجام غير مسبوقة من البيانات المهيكلة وشبه المهيكلة. وفي هذا السياق، تبرز مكتبة PySpark، وهي واجهة بايثون البرمجية لمنصة Apache Spark، كأحد أكثر الحلول الحاسوبية موثوقية وقابلية للتوسع في معالجة البيانات الضخمة. تمتاز هذه البيئة بقدرتها الفائقة على توزيع الأحمال التشغيلية بكفاءة عبر العناقيد الحسابية، مقدمة تجريدات برمجية رفيعة المستوى مثل أطر البيانات (DataFrames) التي تجمع بين سهولة واجهات برمجة التطبيقات ونضج محركات التحسين العلاقية.

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

يهدف هذا المقال الأكاديمي الشامل إلى استعراض وتحليل مختلف المنهجيات والتقنيات البرمجية المتاحة لإضافة أعمدة متعددة إلى إطار بيانات PySpark. سنخوض في أعماق المعمارية الداخلية لمحرك Catalyst، ونقارن بين الأساليب الكلاسيكية والوظائف المحدثة، ونحلل التبعات الأدائية المترتبة على كل خيار برمجي، بالإضافة إلى تقديم إرشادات تطبيقية وحلول استباقية للمشكلات التشغيلية الأكثر شيوعاً في بيئات الإنتاج الحقيقية.

1. المقدمة والأسس النظرية لمعالجة البيانات في بيئة PySpark

1.1 مفهوم عدم القابلية للتغيير في أطر بيانات PySpark

ترتكز الفلسفة المعمارية لمنصة Apache Spark على مبدأ عدم القابلية للتغيير (Immutability)، وهو مفهوم موروث من البنية التحتية الأساسية لمجموعات البيانات الموزعة المرنة (Resilient Distributed Datasets – RDDs). في هذا النموذج الحسابي، لا يمكن تعديل إطار البيانات بمجرد إنشائه واستقراره في ذاكرة العنقود؛ وبدلاً من ذلك، تؤدي أي عملية تحويل (Transformation)—مثل إضافة عمود جديد أو تصفية السجلات—إلى توليد إطار بيانات جديد بالكامل يحمل مخططاً هيكلياً محدثاً مع الاحتفاظ بسجل التتبع التاريخي للتحويلات السابقة فيما يعرف بمخطط النسب (Lineage Graph).

يتناقض هذا التصميم تماماً مع آليات العمل الشائعة في مكتبات تحليل البيانات المحلية مثل Pandas؛ حيث تتيح الأخيرة إجراء تعديلات موضعية مباشرة على هياكل البيانات في الذاكرة العشوائية للجهاز الفردي عبر تخصيص الأعمدة فورياً. وفي المقابل، فإن عدم القابلية للتغيير في PySpark يضمن تجنب حالات سباق البيانات (Race Conditions) ويحقق التسامح مع الأخطاء (Fault Tolerance) عبر العقد الحسابية الموزعة دون الحاجة إلى أقفال تزامن معقدة. ومع ذلك، فإن محاولة محاكاة أساليب Pandas داخل بيئة موزعة دون مراعاة تكلفة إنشاء المخططات الجديدة يؤدي إلى إعادة تخطيط منطقي متكرر ومكلف حسابياً.

1.2 أهمية إضافة الأعمدة المتعددة في هندسة الميزات وتحضير البيانات

تمثل مرحلة إعداد البيانات وهندسة الميزات الجزء الأكبر من الجهد المبذول في دورة حياة مشاريع التعلم الآلي والتحليل الإحصائي المتقدم. تتطلب النماذج الحديثة في كثير من الأحيان إنشاء العشرات أو المئات من المتغيرات المشتقة، مثل تحويل النصوص إلى مقاييس عددية، أو استخراج أجزاء التاريخ والوقت، أو حساب المؤشرات الرياضية التجميعية المعقدة، كما هو الحال في النماذج اللغوية المستخدمة لتقييم المخاطر عبر منصات التواصل (Guecha et al., 2024). وتتضاعف أهمية هذه العمليات عند التعامل مع مجموعات بيانات ضخمة تبلغ أحجامها مئات الجيجابايت أو التيرابايت، حيث تفشل الأنظمة أحادية العقدة في استيعابها ضمن الذاكرة العشوائية.

إن إضافة الأعمدة بصورة متزامنة وفعالة تمكن خطوط الأنابيب (Data Pipelines) من تقليص دورات القراءة والكتابة الوسيطة، مما يقلل البصمة التخزينية ويحسن من تدفق البيانات عبر المعالجات. وعندما تتطلب خوارزميات الاستدلال أو التحليل الرياضي تشكيل ميزات جديدة مشتقة من حقول قائمة، تبرز الحاجة إلى تقنيات تدمج هذه الإضافات دفعة واحدة ضمن عملية إسقاط بياني موحدة بدلاً من تجزئتها؛ حيث يسهم هذا التوحيد في خفض التعقيد الحسابي وتفادي التكرار غير المبرر في بناء المخططات الهيكلية الوسيطة.

1.3 نظرة عامة على محرك Catalyst وتحسين خطط الاستعلام

يمثل محرك Catalyst القلب النابض لنظام Spark SQL وإطار بيانات PySpark، وهو المسؤول عن تحليل وتحسين وتنفيذ كافة العمليات التعبيرية والتحويلية. يعتمد Spark على مبدأ التقييم الكسول (Lazy Evaluation)، مما يعني أن استدعاء دوال إضافة الأعمدة لا ينفذ الحسابات فوراً، بل يقوم بتسجيل العملية ضمن خطة منطقية مجردة (Logical Plan) تأخذ شكل شجرة تعبيرات شجرية (Abstract Syntax Tree). يمر هذا المسار التحليلي بأربع مراحل رئيسية: التحليل الدلالي، والتحسين المنطقي، والتخطيط الفيزيائي، وتوليد الشيفرة البرمجية عبر تقنية Tungsten.

تتأثر هذه الشجرة بصورة مباشرة بكيفية صياغة الشيفرة البرمجية لإضافة الأعمدة؛ فعندما يضيف المطور أعمدة متعددة عبر استدعاءات منفصلة ومتعاقبة، يقوم المحرك في البداية بإنشاء عقدة إسقاط جديدة (Project Node) لكل عملية استدعاء داخل شجرة التحليل. ورغم أن مرحلة التحسين المنطقي تمتلك قواعد متقدمة لدمج عمليات الإسقاط المتتالية (Projection Folding) في خطة مادية واحدة، إلا أن تضخم الشجرة المنطقية الأولية بسلاسل طويلة من العقد المتداخلة يستهلك وقتاً طليعياً كبيراً في مرحلة التحليل، ويزيد من احتمالية تعطل المترجم، مما يبرز الأهمية القصوى لكتابة تعبيرات برمجية صديقة لمحرك التحسين.

2. إعداد بيئة العمل وإنشاء إطار بيانات تجريبي

2.1 تهيئة جلسة SparkSession وضبط الإعدادات الأساسية

تعد جلسة SparkSession نقطة الدخول الموحدة للتعامل مع وظائف Spark المتنوعة منذ إطلاق الإصدار 2.0، مستبدلة السياقات القديمة المجزأة. يتم إنشاء هذه الجلسة برمجياً في بايثون عبر نمط التصميم البنائي (Builder Pattern)؛ حيث يتم تحديد اسم التطبيق ومعلمات التكوين الأساسية التي تحدد نطاق الموارد المتاحة للمحرك، مثل تحديد خادم التشغيل ليكون البيئة المحلية واستخدام النوى المتاحة لتسهيل الاختبار والتطوير المحلي السريع.

يتيح هذا التكوين المرن تعديل معلمات متقدمة تخدم أداء الاستعلامات، مثل ضبط الذاكرة المخصصة للسائق والمنفذين (Driver and Executor Memory)، وتعطيل أو تمكين محرك التنفيذ المتكيف (Adaptive Query Execution – AQE). يساعد التحقق من إنشاء الجلسة بنجاح وطباعة رقم الإصدار في ضمان توافق الواجهات البرمجية المستخدمة، لا سيما الدوال الحديثة التي تتطلب إصدارات معينة من المنصة لتجنب أخطاء وقت التشغيل غير المتوقعة.

2.2 بناء إطار البيانات الأولي للعينات التطبيقية

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

باستخدام دالة إنشاء أطر البيانات (createDataFrame) المدمجة في كائن الجلسة، يتم تحويل القوائم إلى بنية موزعة عبر تحديد أسماء الأعمدة يدوياً أو تمرير مخطط أولي. يتيح استعراض البيانات باستخدام دالة العرض (show) معاينة محاذاة السجلات عبر الشبكة والتأكد من نجاح تقسيم البيانات المبدئي، مما يشكل قاعدة انطلاق متينة لإجراء التجارب التحويلية اللاحقة دون الحاجة إلى الربط مع مصادر تخزين خارجية معقدة في هذه المرحلة التأسيسية.

2.3 فحص المخطط الهيكلي الأولي وأنواع البيانات

يمثل استكشاف المخطط الهيكلي خطوة استباقية إلزامية قبل تطبيق أي تعديلات بنيوية على إطار البيانات. توفر دالة طباعة المخطط (printSchema) شجرة بصرية مفصلة توضح أسماء الحقول وأنواع البيانات المقابلة لها، فضلاً عن تحديد ما إذا كان الحقل يقبل القيم الفارغة (Nullable). يستعرض هذا الفحص كيفية استنتاج المحرك للأنواع؛ إذ يقوم Spark بعملية استدلال تلقائي (Type Inference) قد تعطي نتائج عامة أو غير دقيقة عند غياب التحديد الصريح، كتحويل الأرقام الصغيرة إلى أعداد صحيحة قياسية 64-بت.

إن إدراك الفارق بين الاستدلال التلقائي للأنواع والتعريف الصارم بواسطة كائنات المخططات المخصصة (StructType وStructField) يعد جوهرياً لسلامة النظام. ففي تدفقات البيانات المؤسسية، يؤدي عدم تطابق نوع الحقل المستنتج مع المتطلبات الحسابية إلى فشل الاستعلامات عند إضافة الأعمدة المشتقة لاحقاً، ولذلك فإن توثيق وفحص المخطط المبدئي يضمن ضبط القيود البرمجية ومنع انتشار الأخطاء الخفية إلى المراحل اللاحقة من خط المعالجة.

3. إضافة أعمدة متعددة فارغة باستخدام الدالة lit والتكرار الحلقي

3.1 الأساس النظري لدالة lit والقيم الثابتة الخالية

في بيئة الحوسبة الموزعة الخاصة بـ PySpark، لا يمكن تمرير كائنات بايثون الأولية—مثل الأعداد أو النصوص أو حتى القيمة المجردة الفارغة—مباشرة إلى العمليات التي تتعامل مع الأعمدة، وذلك لأن إطار البيانات يتطلب تعبيرات عمودية (Column Expressions) تفهمها بيئة الجهاز الافتراضي لجافا (JVM) ومحرك Catalyst. تأتي هنا الدالة الحرفية (lit) لتقوم بتغليف القيم الثابتة ضمن كائن تعبيري صالح للاستخدام الحسابي الموزع.

عند الرغبة في إنشاء أعمدة فارغة تمهيداً لملئها لاحقاً، يتم تمرير القيمة الفارغة الخاصة ببايثون إلى الدالة لتوليد قيمة خالية مكافئة في نظام أنواع Spark SQL. يترتب على ذلك تحديد نوع البيانات المستنتج افتراضياً للحقل الفارغ كنوع خالٍ مجرد (VoidType أو NullType). تفرض محركات البيانات العلاقية قيوداً صارمة على التعامل مع هذا النوع؛ إذ يصعب تصديره إلى بعض تنسيقات التخزين العمودية كـ Parquet ما لم يتم تحويل نوعه صراحة إلى نوع محدد مثل النص أو العدد الصحيح، مما يتطلب انتباهاً خاصاً من مهندس البيانات.

3.2 تنفيذ التكرار الحلقي لإضافة أعمدة فارغة بالتسلسل

تلجأ العديد من الحلول البرمجية البسيطة والتقليدية إلى استخدام الحلقات التكرارية (For Loops) عند الحاجة إلى إضافة قائمة طويلة من الأعمدة الفارغة أو التي تحمل قيماً أولية موحدة. في هذا النمط، يتم تعريف قائمة تحتوي على أسماء الأعمدة الجديدة المستهدفة، ثم الدخول في حلقة تكرارية تمر على كل اسم، مستدعية دالة إضافة العمود (withColumn) بالتزامن مع الدالة الحرفية لإنشاء العمود وتعيين قيمته.

يتم في كل دورة تكرار إعادة إسناد إطار البيانات الناتج إلى نفس المتغير المرجعي، كما يظهر في النمط البرمجي التوضيحي التالي الذي يوضح تسلسل الخطوات منطقياً:

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

3.3 تقييم الكفاءة والعيوب المحتملة لطريقة التكرار الحلقي

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

عندما تتجاوز قائمة الأعمدة عشرات أو مئات الحقول، يتضخم عمق الشجرة إلى مستويات قد تستنزف الذاكرة المخصصة لمكدس الاستدعاءات (Stack Memory) في بيئة التشغيل، مؤدية إلى توقف التطبيق بالكامل قبل الوصول إلى مرحلة التنفيذ المادي للبيانات. ومن ثم، يقتصر الاستخدام المقبول لهذا الأسلوب فقط على السيناريوهات البسيطة جداً التي لا يتجاوز فيها عدد الأعمدة المضافة بضعة حقول محدودة وضمن بيئات التحليل الاستكشافي المؤقت، بينما يُحظر اعتماده نهائياً في خطوط إنتاج البيانات الضخمة عالية الأداء.

4. إضافة أعمدة متعددة مشتقة عبر التسلسل المتتابع لدالة withColumn

4.1 آلية ربط العمليات الحسابية المتسلسلة (Method Chaining)

يعتمد أسلوب التسلسل المتتابع (Method Chaining) على الخصائص الوظيفية للواجهة البرمجية في PySpark؛ حيث تعيد دالة إضافة العمود (withColumn) كائن إطار بيانات جديد دائماً، مما يتيح للمطورين ربط الاستدعاءات المتعددة معاً بشكل متصل وراء بعضها البعض دون الحاجة إلى إنشاء متغيرات وسيطة في كل خطوة. يمثل هذا النمط أسلوباً برمجياً أنيقاً يسهل قراءة مسار تحويل البيانات بصورة خطية واضحة المعالم.

يسمح هذا الربط بإجراء حسابات رياضية مباشرة على قيم الحقول الأصلية لتوليد أعمدة جديدة، كحساب النسب المئوية، أو ضرب مؤشرات الكمية في الأسعار الفردية، أو تحويل الوحدات القياسية. يسهم تنظيم الشيفرة بوضع كل عملية استدعاء في سطر مستقل داخل أقواس في تحسين إمكانية تتبع الأخطاء البرمجية وصيانة الشيفرة بواسطة فرق العمل المشتركة، فضلاً عن تقديم تصور بصري مباشر لتتابع تدفق التغييرات على الأعمدة.

4.2 توليد أعمدة مبنية على علاقات رياضية ومنطقية مركبة

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

تتطلب هذه العمليات الحذر الشديد في معالجة الحالات الاستثنائية، مثل تفادي خطأ القسمة على الصفر والتعامل مع القيم المفقودة المحتملة في السجلات؛ إذ ينبغي إحاطة الحسابات بدوال التحقق الشرطي لضمان عدم توليد قيم غير معرفة تؤدي إلى إفساد التحليلات الرياضية اللاحقة. ورغم مرونة هذا الترابط البرمجي وسهولة كتابته، إلا أنه يعتمد على دقة الترتيب الزمني للاستدعاءات لضمان وجود الأعمدة المعتمد عليها في المراحل السابقة من السلسلة.

4.3 الآثار الجانبية للتسلسل الطويل لدوال withColumn

على الرغم من جاذبية أسلوب التسلسل البرمجي وسهولة قراءته، إلا أنه يشترك مع التكرار الحلقي في ذات القصور المعماري الكامن في تعدد عقد الإسقاط. في الإصدارات التي سبقت Apache Spark 3.3، كان كل ربط إضافي لدالة withColumn يفرض على محلل Catalyst عبئاً تحليلياً متزايداً؛ إذ يجب على المحرك تحليل كل عقدة إسقاط منفردة والتأكد من مطابقتها للقواعد الدلالية قبل الشروع في دمجها مع العقد الأخرى.

أظهرت القياسات المعيارية في هندسة النظم أن استدعاء هذه الدالة بالتسلسل لأكثر من مائة مرة متتالية يرفع زمن التخطيط والتحسين المنطقي إلى عدة دقائق، وقد يفوق الوقت المستغرق في تخطيط الاستعلام وقت معالجة البيانات الفعلي بمرات عديدة. ينتج عن ذلك تراجع ملموس في كفاءة خطوط المعالجة المستمرة، مما جعل مجتمع مهندسي الحوسبة الموزعة يطالب بابتكار بدائل بنيوية تدعم التحويل الدفعي الموحد لإلغاء هذا الأثر التراكمي السلبي.

5. استخدام دالة withColumns الحديثة في إصدارات PySpark المتقدمة

5.1 مفهوم دالة withColumns ودوافع إدخالها في Spark 3.3

استجابة للقيود البنيوية المزمنة الناتجة عن تكرار استدعاءات الإسقاط الفردية، قامت مؤسسة Apache بإدخال الدالة المجمعة الحديثة withColumns رسمياً ضمن إصدار Apache Spark 3.3.0 (في يونيو 2022 عبر بطاقة التحسين التقنية SPARK-35173). كان الهدف الأساسي من هذه الإضافة هو توفير واجهة برمجية موحدة تتيح إضافة أو استبدال مجموعة متعددة من الأعمدة في استدعاء برمجي وحيد ومباشر.

يمثل هذا التحديث نقلة نوعية في فلسفة الواجهات البرمجية لـ PySpark؛ حيث نقلت المنصة من معالجة تحويلات الأعمدة كأحداث فردية متتالية إلى معالجتها ككتلة تحويلية ذرية واحدة. يضمن هذا النهج التوافق الكامل مع بنية المخططات الحديثة ويسهم في توحيد صياغة الشيفرات البرمجية، متيحاً للمؤسسات تحديث مشاريعها القائمة للتخلص من السلاسل الحسابية الطويلة دون التضحية بوضوح الشيفرة أو مرونتها.

5.2 التطبيق العملي وتمرير القواميس البرمجية للدالة

تعتمد آلية عمل الدالة المجمعة على تمرير هيكل بيانات من نوع قاموس بايثون (Dictionary)، حيث تمثل المفاتيح أسماء الأعمدة الجديدة أو المستهدفة بالتعديل، بينما تمثل القيم المقابلة لها التعبيرات البرمجية أو الدوال الحرفية والحسابية المسؤولة عن اشتقاق قيم تلك الأعمدة. يتم تمرير هذا القاموس دفعة واحدة كمعامل رئيسي للدالة، مما يقلص حجم الشيفرة المكتوبة بصورة جذرية.

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

5.3 مزايا تحسين الأداء وتخفيف عبء محلل Catalyst

يكمن التفوق التقني الحقيقي لدالة withColumns في تفاعلها المباشر والأمثل مع محرك التحسين Catalyst. بدلاً من بناء شجرة استعلام تحتوي على العشرات من عقد الإسقاط المتداخلة، تقوم هذه الدالة بتوليد عقدة إسقاط واحدة فقط (Single Project Node) في الشجرة المنطقية تحتوي على جميع التعبيرات البرمجية المحددة في القاموس، مما يلغي تماماً الحاجة إلى مرحلة دمج الإسقاطات المرهقة التي كانت تستهلك وقتاً طويلاً وموارداً ضخمة في الإصدارات السابقة.

ينعكس هذا التحسين المعماري في تقليص استهلاك ذاكرة السائق بنسبة كبيرة، وتسريع مرحلة الترجمة والتخطيط الفيزيائي للاستعلام لتستغرق أجزاءً من الثانية حتى مع وجود مئات الحقول. علاوة على ذلك، يتيح التحويل الدفعي لمحرك Tungsten توليد شيفرة بايت كود (Bytecode) عالية الكفاءة للجهاز الافتراضي لجافا، حيث يتم تقييم تعبيرات الأعمدة المتعددة ضمن حلقة معالجة واحدة على مستوى السجل، مما يضمن الاستغلال الأقصى لذاكرة التخزين المؤقت في المعالجات الحسابية وتحقيق أقصى درجات الإنتاجية.

6. تطبيق دالتي select و selectExpr لإضافة وتعديل الأعمدة دفعة واحدة

6.1 إعادة بناء المخطط وتوسيع الأعمدة عبر دالة select

تعد دالة التحديد (select) واحدة من أكثر الأدوات كفاءة وتأصيلاً في Spark SQL منذ إصداراته الأولى؛ حيث تسمح بإعادة بناء المخطط الإسقاطي لإطار البيانات كلياً أو جزئياً بطلب برمجي واحد. لإضافة أعمدة متعددة مع الاحتفاظ بكافة البيانات والحقول السابقة دون حذف، يتم دمج التعبير النجمي (col("*") أو الرمز النصي المماثل) مع قائمة التعبيرات الخاصة بالأعمدة الجديدة المضافة.

يتيح هذا الأسلوب تحديد الحقول الجديدة عبر استدعاء دوال الأعمدة (col) وتطبيق العمليات الرياضية أو المنطقية عليها مباشرة، ثم منح كل حقل جديد اسماً معرفاً باستخدام دالة التسمية المستعارة (alias). تمتاز هذه الطريقة بأنها تُترجم فورياً إلى عقدة إسقاط موحدة تماماً كما تفعل دالة withColumns، مما يجعلها الخيار الكلاسيكي الأمثل والمفضل للمهندسين الذين يعملون على إصدارات قديمة من Spark لا تدعم الوظائف المحدثة، مع الحفاظ على ذات الكفاءة العالية لخطة الاستعلام.

6.2 الاستفادة من مرونة تعبيرات SQL باستخدام selectExpr

تقدم دالة التعبيرات النصية (selectExpr) متنفساً واسعاً من المرونة والإنتاجية العالية؛ إذ تمكن المطورين من كتابة تعبيرات برمجية كاملة باستخدام صياغة لغة الاستعلامات البنيوية القياسية (ANSI SQL) المباشرة ضمن سلاسل نصية واضحة، متجاوزة الحاجة إلى استيراد وتغليف الدوال البرمجية بلغة بايثون. يمكن للمطور كتابة التعبير النجمي للاحتفاظ بالأعمدة القائمة متبوعاً بنصوص التحويلات الجديدة بدقة وسلاسة.

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

6.3 المقارنة التحليلية بين withColumns ودوال select

تخضع المفاضلة الهندسية بين استخدام دالة withColumns المجمعة ودوال التحديد (select وselectExpr) لعدة معايير تتعلق بجودة الشيفرة، والتوافق، والوضوح الدلالي. من الناحية الأدائية الصرفة، تتطابق الطرق الثلاث في الخطة الفيزيائية النهائية المتولدة عن محرك Catalyst، حيث تُترجم جميعها إلى عملية إسقاط واحدة تدمج كافة التعبيرات البرمجية؛ مما يعني غياب أي فارق ملموس في زمن التنفيذ الفعلي أو استهلاك الذاكرة على مستوى العقد الحسابية العاملة.

تكمن الفروق الحقيقية في الصيانة وقابلية القراءة؛ إذ توفر withColumns نمطاً برمجياً وثيق الصلة بفلسفة بايثون الحديثة بفضل اعتمادها على القواميس، وتتجنب العيوب المحتملة للتعبيرات النصية في selectExpr التي تفتقر إلى التحقق الإملائي أثناء كتابة الشيفرة البرمجية. من جانب آخر، تتفوق دالة select الكلاسيكية في ثبات توافقها عبر كافة إصدارات Spark دون استثناء، مما يجعل الاختيار بينها محكوماً ببيئة التشغيل المعتمدة والمعايير الهندسية للمؤسسة.

7. إضافة أعمدة متعددة استناداً إلى الدوال المعرفة من المستخدم (UDFs)

7.1 بناء دوال UDF التقليدية وتوليد هياكل بيانية معقدة

عندما تعجز الدوال المضمنة في إطار العمل عن تلبية المتطلبات التحويلية المخصصة—كما في حالات تطبيق خوارزميات التشفير المعقدة أو التحليلات الرياضية الحصرية—يصبح اللجوء إلى الدوال المعرفة من قبل المستخدم (User Defined Functions – UDFs) أمراً لا مفر منه. لإضافة أعمدة متعددة من خلال استدعاء دالة واحدة لتجنب تكرار الحسابات المكلفة، يقوم المطور ببرمجة دالة بايثون تقليدية تعيد هيكلاً بيانياً مركباً مثل صف مركب (Tuple) أو قاموس يحوي الحقول الناتجة.

يتم تسجيل هذه الدالة عبر تحديد مخطط الإرجاع بدقة باستخدام نوع البيانات الهيكلي (StructType) الذي يحتوي على قائمة من الحقول الفرعية المحددة. وعند تطبيق الدالة على إطار البيانات، يتولد عمود مركب واحد يضم كافة المخرجات؛ يعقب ذلك تفكيك هذا العمود المركب إلى أعمدة متعددة ومستقلة باستخدام دالة التحديد وتطبيق مسارات الوصول النقطية (Dot Notation) أو مشغلات التوسيع، مما يضمن الحصول على مخطط أفقي متكامل.

7.2 استخدام Pandas UDFs (Vectorized) لتحقيق كفاءة عالية

تعاني الدوال التقليدية من مشكلات بطء جوهرية، وهو ما تمت معالجته جذرياً عبر إدخال الدوال المتجهية المعروفة بـ Pandas UDFs، والتي تعتمد على مكتبة Apache Arrow للتبادل البياني في الذاكرة. تتيح هذه الواجهة المتقدمة تنفيذ العمليات على دفعات موجهة من البيانات بتنسيق متجهي، بدلاً من معالجة كل سجل على حدة، مستفيدة من كفاءة المعالجة فائقة السرعة المتوفرة في مكتبة Pandas ونواة C المدمجة بها.

تمكن هذه التقنية المطورين من بناء دوال تستقبل وتُرجع إطار بيانات كامل من نوع Pandas DataFrame يحتوي على أعمدة متعددة مشتقة في خطوة واحدة، مع الاستفادة من تسريع التحويلات الرياضية المعقدة ومعالجة المتجهات وسلاسل النصوص في مهام هندسة الميزات ونماذج الاستدلال (Guecha et al., 2024). يؤدي استخدام تنسيق Arrow إلى تفادي عمليات النسخ المكلفة في الذاكرة، محققاً قفزات أدائية هائلة تتفوق بمراحل على الدوال الفردية وتجعل معالجة البيانات المعقدة على نطاق العناقيد الحسابية أمراً عملياً وقابلاً للتوسع المستمر.

7.3 المحاذير والتحديات عند تطبيق الدوال المعرفة على نطاق واسع

على الرغم من المرونة اللامحدودة التي تقدمها الدوال المعرفة من قبل المستخدم، إلا أنها تأتي بتكلفة معمارية باهظة تجعلها الملاذ الأخير لمهندس البيانات المتمرس. تكمن المعضلة الرئيسية في كلفة التسلسل وإلغاء التسلسل (Serialization Cost) للبيانات؛ حيث يتطلب تنفيذ دالة بايثون نقل السجلات من بيئة تشغيل جهاز جافا الافتراضي (JVM) الخاصة بـ Spark إلى مفسر بايثون الفرعي عبر قنوات اتصال وسيطة (Py4J)، ثم إعادة النتائج إلى بيئة جافا، مما يخلق عنق زجاجة حرج في نقل البيانات والذاكرة.

علاوة على ذلك، يتسبب استخدام هذه الدوال في حجب الرؤية عن محرك التحسين Catalyst، إذ يعامل الدالة كصندوق أسود غير معلوم المحتوى، مما يؤدي إلى تعطيل العديد من التحسينات التلقائية المتقدمة مثل دفع عوامل التصفية (Filter Pushdown) وتوليد الشيفرات المجمعة. لذا، تنص الإرشادات الهندسية القياسية على تفضيل واستنفاد كافة الحلول الممكنة عبر حزمة الدوال المضمنة في pyspark.sql.functions قبل التفكير في كتابة دالة مخصصة، حرصاً على استقرار وأداء المنظومة الموزعة ككل.

8. التعامل مع الشروط المنطقية والتحويلات المعقدة لتوليد الأعمدة

8.1 توظيف الدالة الشرطية when و otherwise لإضافة أعمدة مشروطة

تعتبر الدالة الشرطية المتكاملة (when وotherwise) البديل الوظيفي الموزع لعبارات الشرط المتفرعة في لغات البرمجة ولتعبيرات CASE WHEN في لغة SQL. تتيح هذه المنظومة إنشاء أعمدة متعددة تعتمد قيمها على شروط منطقية متسلسلة ومتعددة الطبقات، حيث تفحص القيود المطبقة على حقول سابقة لتحديد القيمة المقابلة في العمود المستهدف، كتقسيم العملاء إلى شرائح سعرية وفق أنماط إنفاقهم أو تعيين حالات المعاملات وفق أطرها الزمنية.

يمكن للمطور تنظيم شروط متعددة ومترابطة لتوليد حقول متنوعة في آن واحد؛ حيث تتكامل هذه الدوال الشرطية بانسجام كامل مع دوال التحديد المجمعة مثل withColumns أو select. تضمن صياغة الشروط بدقة توفير قيم افتراضية عبر دالة otherwise لتجنب ترك القيم الفارغة في الحالات التي لا تتحقق فيها المعايير الشرطية، مما يعزز تكامل البيانات ويوفر بنية قوية قادرة على معالجة السيناريوهات غير النمطية دون توقف خط الإنتاج.

8.2 استخدام المصفوفات والخرائط لتوليد أعمدة ديناميكية

تتطلب معالجة البيانات غير المتجانسة أو مخرجات الأنظمة غير العلاقية استخدام أنواع بيانات مركبة كالمصفوفات (Arrays) وخرائط المفاتيح والقيم (Maps). يمكن استغلال هذه التراكيب بكفاءة عالية لتوليد أعمدة جديدة متعددة؛ فباستخدام دالة تكوين المصفوفات (array)، يمكن جمع بيانات عدة حقول متباعدة زمنياً أو تصنيفياً في مسار واحد، ثم تطبيق دوال التحويل المتخصصة لاستخراج الإحصائيات الفورية أو تحديد القيم القصوى والدنيا منها كأعمدة مستقلة.

في المقابل، تسمح دوال التفكيك والتوسيع (مثل explode أو posexplode) بتحويل عناصر المصفوفات والخرائط إلى صفوف وأعمدة إضافية متعددة، وهو ما يشيع استخدامه في تنظيف النصوص وتجزئة الجمل أو معالجة وثائق JSON المتداخلة. يتيح هذا النهج التفكيكي والتجميعي مرونة ديناميكية فائقة في اشتقاق أبعاد تحليلية جديدة، شريطة استخدامها بحذر ومراقبة مستويات تضاعف البيانات الناتجة لتجنب تضخم حجم الذاكرة المستهلكة في عمليات التفكيك الكبيرة.

8.3 معالجة القيم المفقودة واستبدالها أثناء إنشاء الأعمدة

تمثل القيم المفقودة (Null Values) أحد أكبر التحديات التي تهدد دقة التحليلات الرياضية واستقرار النماذج التنبؤية. توفر PySpark دالة الدمج والتعيين المتقدمة (coalesce) كحل رئيسي لتوليد أعمدة جديدة تعتمد على تقييم قائمة مرتبة من الحقول البديلة؛ حيث تلتقط الدالة أول قيمة غير فارغة من بين الحقول المحددة، مما يسهل معالجة البيانات متعددة المصادر وتوحيد معلومات الاتصال أو الأرقام التعريفية البديلة بكفاءة تامة.

بالتوازي مع ذلك، يمكن ربط استراتيجيات إنشاء الأعمدة بدوال ملء القيم الشاغرة (fillna) أو استبدالها صراحة عبر الشروط المنطقية الموجهة، لضمان استقرار العمليات الحسابية ومنع تسرب الفراغات إلى الحقول المشتقة الجديدة. يحافظ هذا الدمج المنهجي بين التحقق والتوليد على نقاء البيانات واتساقها عبر تدفقات المعالجة المستمرة، ويجنب المؤسسات تكاليف التصحيح والتنظيف المتأخرة التي تستهلك وقتاً تشغيلياً مضاعفاً إذا ما تركت حتى مراحل ما بعد الإنتاج.

9. تحليل الأداء المعماري واستكشاف الأخطاء الشائعة وإصلاحها

9.1 أخطاء استهلاك الذاكرة وتجاوز حدود مكدس الاستدعاء (StackOverflowError)

يعد الخطأ البرمجي المتمثل في تجاوز حدود مكدس الذاكرة (java.lang.StackOverflowError) أحد أكثر المشاكل المعمارية شهرة وإحباطاً لمهندسي البيانات عند إضافة أعداد كبيرة من الأعمدة. لا ينجم هذا الخطأ عن نقص في حجم الذاكرة العشوائية للبيانات (Heap Memory)، بل يعود إلى التضخم الهائل في عمق شجرة التحليل المنطقية الناتجة عن تكرار استدعاءات withColumn في حلقات برمجية طويلة؛ حيث تعتمد خوارزميات محرك Catalyst على دوال الاستدعاء الذاتي العودي (Recursion) في فحص وتحسين عقد الشجرة، مما يؤدي إلى استنزاف مكدس الاستدعاءات وسقوط السائق فورياً.

لتشخيص هذه العلة ومعالجتها بنجاح، يجب أولاً إعادة هيكلة الشيفرة البرمجية لاعتماد الأساليب الدفعية الموحدة كدالة withColumns أو select. وفي الحالات الاستثنائية التي تفرض فيها المنطقية الحسابية وجود مراحل وسيطة معقدة، يمكن اللجوء إلى تقنية نقاط التحقق المادية (Checkpointing)؛ حيث تقوم هذه التقنية بحفظ البيانات المحسوبة على وسائط تخزين دائمة وموثوقة (مثل نظام HDFS أو التخزين السحابي)، وقطع شجرة النسب الطويلة بالكامل وإعادة بناء خطة استعلام جديدة تماماً تبدأ من تلك النقطة المحفوظة، مما يحمي النظام من الانهيار الحسابي.

9.2 أخطاء تضارب الأسماء وعدم توافق أنواع البيانات

تتكرر أخطاء وقت التشغيل المرتبطة بتضارب المسميات الدلالية عند إضافة أعمدة جديدة تحمل أسماء تتطابق مع حقول موجودة مسبقاً، خاصة في بيئات البيانات التي لا تفعل التحقق الصارم من تكرار الأسماء (Case-Insensitive Resolution). في بعض الحالات، يؤدي استدعاء دالة إضافة العمود بالاسم ذاته إلى استبدال الحقل الأصلي بصمت دون تنبيه المطور، أو على النقيض، يؤدي إلى إطلاق استثناءات دلالية عند محاولة إسقاط الحقول في بيئات التخزين العلاقية التي ترفض الحقول المتكررة في المخطط الواحد.

إلى جانب ذلك، يبرز خطر عدم توافق أنواع البيانات (Type Mismatch) عند تمرير تعبيرات ينتج عنها نوع لا يتوافق مع قيود الحقل أو النظام المستهدف. يتطلب الحل الاحترافي تطبيق التحويل الصريح للأنواع باستخدام دالة التحويل (cast) المقترنة بأساليب التسمية المعيارية الصارمة. كما يُنصح ببناء وحدات تحقق برمجية آلية (Assertion Checks) تقارن المخطط الناتج مع مخطط مرجعي محدد مسبقاً قبل تصدير البيانات إلى مستودعات الحفظ النهائية لضمان الحوكمة واستقرار التطبيقات المستهلكة.

9.3 قراءة وتفسير خطة التنفيذ باستخدام دالة explain

تمثل دالة استعراض خطة التنفيذ (explain) الأداة التحليلية الأساسية لتفكيك غموض العمليات الحسابية داخل PySpark والتأكد من جودة الشيفرة المكتوبة. عند استدعاء هذه الدالة—خاصة مع تفعيل النمط الموسع (Extended Mode)—تعرض المنصة أربعة مستويات من الخطط: الخطة المنطقية التي تم تحليلها، والخطة المنطقية غير المحللة، والخطة المنطقية المحسنة، وصولاً إلى الخطة الفيزيائية (Physical Plan) التي سيتم تنفيذها فعلياً عبر العقد العاملة.

من خلال الفحص البصري للخطة الفيزيائية، يمكن لمهندس البيانات ملاحظة كيفية تعامل المحرك مع عمليات إضافة الأعمدة المتعددة؛ فالشيفرة المحسنة والمكتوبة بطريقة سليمة تظهر مرحلة إسقاط وحيدة ومركزية تحمل الاسم التقني (Project)، حيث تُجمع بداخلها كافة التعبيرات الحسابية المطلوب تنفيذها على السجلات. أما في حال ظهور طبقات متراكمة من مراحل الإسقاط المتعاقبة، فإن ذلك يشير مباشرة إلى وجود خلل بنيوي في صياغة الشيفرة يستوجب التدخل وإعادة البناء لتحسين الكفاءة وضمان استغلال الموارد المتاحة على النحو الأمثل.

10. أفضل الممارسات البرمجية والتوصيات لهندسة البيانات في بيئات الإنتاج

10.1 المعايير الموصى بها لاختيار الطريقة المثلى لإضافة الأعمدة

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

في مشاريع الإنتاج الحديثة التي تعتمد على Apache Spark 3.3 فما فوق، يمثل استخدام دالة withColumns الخيار القياسي النموذجي والمعياري الأول، نظراً لأنها تجمع بين الكفاءة الهندسية في دمج مراحل الإسقاط، والوضوح البرمجي العالي عبر قواميس بايثون القياسية. أما في البيئات المؤسسية الأقدم أو الأنظمة ذات الطابع العائلي لفرق تفضل صياغة SQL، فإن استخدام selectExpr أو select الكلاسيكية يظل البديل المكافئ تماماً من حيث الأداء والسرعة، بينما يجب التوقف النهائي عن استخدام الحلقات التكرارية والسلاسل الطويلة لدالة withColumn المنفردة في أي مسار تشغيلي واسع النطاق.

10.2 هندسة الشيفرة وقابليتها لإعادة الاستخدام والاختبار البرمجي

تقتضي معايير الجودة البرمجية المتقدمة في هندسة البيانات تجنب كتابة الشيفرات المتناثرة أو المعالجات المباشرة داخل دفاتر الملاحظات التفاعلية (Jupyter Notebooks) في بيئات الإنتاج. بدلاً من ذلك، يجب تغليف كافة عمليات إضافة وتحويل الأعمدة داخل دوال وظيفية مخصصة ومستقلة (Transformation Functions) تقبل إطار بيانات كمعامل دخل، وتطبق القاموس التحويلي، ثم تعيد إطار البيانات المحدث.

يسهل هذا التجريد الوظيفي كتابة اختبارات الوحدة البرمجية (Unit Tests) باستخدام أطر اختبار بايثون القياسية مثل pytest؛ حيث يتم تغذية الدالة بإطار بيانات اختباري صغير ومعلوم النتائج مسبقاً، للتحقق رياضياً ومنطقياً من صحة قيم الأعمدة الجديدة ودقة مخططاتها الهيكلية. علاوة على ذلك، يتيح هذا النهج توثيق المخططات عبر أدوات إدارة الحوكمة المرجعية مثل Great Expectations، مما يضمن اكتشاف انحرافات البيانات والتحولات غير المقصودة في المخططات بصورة آلية وفورية قبل وصولها إلى مستودعات البيانات الإنتاجية.

10.3 تحسين استهلاك الموارد في العناقيد الحسابية الموزعة

لا تنفصل كفاءة إضافة الأعمدة عن الاستراتيجية الشاملة لإدارة موارد العنقود الحسابي؛ إذ إن العمليات الحسابية المرافقة لاشتقاق الأعمدة تتطلب مراقبة دقيقة لكيفية توزيع البيانات عبر الأقسام (Partitions). عند إضافة أعمدة ناتجة عن عمليات تجميع أو مطابقة، يجب مراقبة ظاهرة تشتت البيانات (Data Skew) وإعادة التقسيم الواعي (Repartitioning or Coalescing) لضمان توزيع متوازن لحمل العمل على كافة المعالجات العاملة دون تأخير ناتج عن عقدة فردية بطيئة.

إضافة إلى ذلك، يجب الحذر من الإفراط في التخزين المؤقت (Caching)؛ إذ يعتقد بعض المطورين خطأً أن تخزين إطار البيانات بعد إضافة الأعمدة يعد ممارسة إيجابية دائماً، في حين أن ذلك يستهلك مساحات هائلة من الذاكرة العشوائية قد تؤدي إلى إجبار المنظومة على إفراغ البيانات إلى الأقراص الصلبة (Spill to Disk)، مما يقلل السرعة بصورة كارثية. ينبغي قصر التخزين المؤقت فقط على أطر البيانات ذات الأعمدة المشتقة التي ستُقرأ عدة مرات في فروع حسابية متفرقة، مع الاستعانة الدائمة بواجهة المستخدم الرسومية لمنصة Spark (Spark UI) لمراقبة مراحل التنفيذ ومخططات الذاكرة واستكشاف الاختناقات الأدائية في الوقت الحقيقي.

خاتمة

استعرض هذا المقال الموسع والشامل مختلف المنهجيات والتقنيات البرمجية المتبعة لإضافة أعمدة متعددة إلى إطار بيانات PySpark، مبيناً الفروق الجوهرية بين الأنماط الكلاسيكية والوظائف المحدثة ذات الكفاءة العالية. لقد اتضح جلياً أن فهم المعمارية الكامنة لمحرك Catalyst ومبدأ عدم القابلية للتغيير يمثلان الفارق الحقيقي بين الشيفرة البرمجية التي تكتفي بالعمل في النطاقات التجريبية الضيقة، وتلك المصممة للعمل بكفاءة وموثوقية في بيئات الإنتاج الحقيقية ومعالجة البيانات العملاقة دون استنزاف موارد النظام.

إن تبني الأدوات الحديثة مثل دالة withColumns أو الاستثمار في التعبيرات الموحدة لدوال select وselectExpr ليس مجرد تحسين لجمالية الشيفرة وتسهيل صيانتها، بل هو ضرورة حاسمة لحماية الأنظمة الموزعة من أخطاء الذاكرة القاتلة ولتخفيض كلفة التخطيط والاستعلام بنسب ملموسة. وفي ختام هذا المسار الهندسي، نؤكد أن نجاح خطوط أنابيب البيانات لا يعتمد فقط على دقة الحسابات المنطقية للميزات المشتقة، بل يرتكز أساساً على كتابة تعبيرات برمجية تحترم البنية الفيزيائية للمعالجة الموزعة، مما يضمن كفاءة استهلاك الموارد المادية وتحقيق أقصى عائد تحليلي للمؤسسات الحديثة.

المراجع

Guecha, D., Potdar, A., & Miyaguchi, A. (2024). DS@GT eRisk 2024: Sentence Transformers for Social Media Risk Assessment. arXiv (Cornell University). https://doi.org/10.48550/arxiv.2407.08008

تقييم هذا المحتوى

كن أول من يقيّم هذا المحتوى

اقتباس هذا المقال

looti, M. (2026, أكتوبر 28). كيفية إضافة أعمدة متعددة إلى إطار بيانات PySpark. عرب سايكلوجي. https://arabpsychology.com/statistics/how-to-add-multiple-columns-to-pyspark-dataframe/
looti, Mohammed. “كيفية إضافة أعمدة متعددة إلى إطار بيانات PySpark.” عرب سايكلوجي, 28 أكتوبر 2026, https://arabpsychology.com/statistics/how-to-add-multiple-columns-to-pyspark-dataframe/.
looti, Mohammed. “كيفية إضافة أعمدة متعددة إلى إطار بيانات PySpark.” عرب سايكلوجي. أكتوبر 28, 2026. https://arabpsychology.com/statistics/how-to-add-multiple-columns-to-pyspark-dataframe/.