إطار البيانات في Apache PySpark: برنامج تعليمي شامل [مع أمثلة]
نشرت: 2020-02-27اليوم ، سنتعرف على DataFrame في Apache PySpark . Pyspark هي واحدة من أفضل أدوات علوم البيانات في عام 2020. وهي تسمى أعمدة مجموعة موزعة من الصفوف في Apache Spark. إنه مشابه جدًا للجداول أو الأعمدة في أوراق Excel ويشبه أيضًا جدول قاعدة البيانات العلائقية. يتميز PySpark DataFrame أيضًا بخصائص مماثلة لـ RDD ، وهي:
التوزيع: يتم توزيع كل من طبيعة DataFrame و RDD
التقييمات الكسولة: لا يتم تنفيذ المهمة إذا لم يتم تنفيذ الإجراء
طبيعة غير قابلة للتغيير: خاصية أخرى مشابهة لـ RDD / DataFrame وهي أنه لا يمكن تغييرها بمجرد إنشائها. ولكن يمكن للمرء تطبيق التحول لتحويل RDD / DataFrame.
جدول المحتويات
ميزة DataFrames
1. يدعم هذا العديد من اللغات المختلفة ، مثل Java و Scala و R و Python ، وهو أمر مفيد من حيث دعم API. يساعد دعم API للغات متعددة في العمل مع العديد من لغات البرمجة.
2. يتم دعم مجموعة كبيرة من مصادر البيانات والتنسيقات بواسطة DataFrame ، مما يساعد كثيرًا في استخدام مصدر مختلف للبيانات وتنسيقها بشكل ملائم.
3. أحد أفضل الأجزاء في DataFrame هو أنه يمكنه حتى التعامل مع وحدات بيتابايت من البيانات ، وهي قدرة رائعة على التعامل مع مثل هذه البيانات الضخمة.
4. يتفهم Apache Spark بسرعة مخطط DataFrame مع الملاحظة في Spark DataFrame. تحت الأعمدة المسماة ، يتم تنظيم Spark DataFrame's Observation. بهذه الطريقة ، يتم تحسين خطة تنفيذ الاستعلامات.
5. يمكن معالجة حجم هائل من البيانات شبه المهيكلة والمنظمة بسرعة لأنها مصممة للقيام بذلك إطارات البيانات.
إعداد Apache Spark
يجب إعداد Apache Spark في الجهاز قبل أن يمكن بدء استخدامه لعمليات DataFrame. يمكن تشغيل البيانات بدعم من DataFrame لأنها تدعم عمليات DataFrame المختلفة. سنناقش هنا بعض عمليات DataFrame الشائعة.
يعد إنشاء SparkContext الخطوة الأولى في برمجة Apache. لتنفيذ العمليات في كتلة ، هناك متطلب من SparkContext. يتم إخبار SparkContext بكيفية الوصول إلى الكتلة. يُظهر أيضًا شرارة حول موقع الحصول على كتلة.
قراءة: أطر التعلم العميق
ثم يتم إنشاء اتصال Apache Cluster. تم إنشاؤه بالفعل إذا كان المرء يستخدم Spark Shell. الطريقة الأخرى ، إعداد التكوين ، يمكن توفيرها وتهيئتها واستيرادها لإنشاء SparkContext.
يمكن للمرء استخدام هذا الرمز للإنشاء:
من pyspark استيراد SparkContext
sc = SparkContext ()
إنشاء DataFrame من ملف CSV
يجب تحديد مكتبة جديدة في غلاف python حتى يمكن قراءة ملف CSV. للقيام بذلك ، فإن الخطوة الأولى هي تنزيل أحدث إصدار من حزمة Spark-CSV والقيام باستخراج الحزمة في Spark's Home Directory. بعد ذلك ، سنفتح غلاف PySpark ، ويجب تضمين الحزمة.
$ ./bin/pyspark –packages com.databricks: spark-csv_2.10: 1.3.0
الآن سيتم إنشاء DataFrame بعد قراءة البيانات من ملف CSV.
train = sqlContext.load (المصدر = ”com.databricks.spark.csv” ، المسار = 'PATH / train.csv' ، header = True ، inferSchema = True)
test = sqlContext.load (المصدر = ”com.databricks.spark.csv” ، المسار = 'PATH / test-comb.csv' ، header = True ، inferSchema = True)
توجد ملفات اختبار CSV وملفات تدريب CSV في موقع المجلد المسمى PATH. إذا كان العنوان موجودًا في ملف CSV ، فسيظهر على أنه True. لمعرفة نوع البيانات في كل عمود من إطار البيانات ، سوف نستخدم inferSchema = True option. باستخدام خيار inferSchema = True ، سيتم الكشف عن نوع بيانات إطار البيانات لكل عمود تلقائيًا بواسطة سياق SQL. سيتم قراءة جميع الأعمدة كسلسلة إذا لم نقم بتعيين inferSchema ليكون صحيحًا.
قراءة: مكتبات Python لتعلم الآلة
معالجة DataFrame
الآن سنرى هنا كيفية التعامل مع إطار البيانات:
- تعرف على نوع بيانات الأعمدة
سيتم استخدام printSchema لمعرفة نوع العمود ونوع بياناته. الآن ستتم طباعة المخطط بتنسيق شجرة عن طريق تطبيق printSchema ().
train.printSchema ()
انتاج:
جذر
| - User_ID: عدد صحيح (nullable = true)
| - Product_ID: سلسلة (nullable = true)
| - الجنس: سلسلة (nullable = true)
| - العمر: سلسلة (nullable = true)
| - الوظيفة: عدد صحيح (nullable = true)
| - City_Category: سلسلة (nullable = true)
| - Stay_In_Current_City_Years: سلسلة (nullable = true)
| - Marital_Status: عدد صحيح (nullable = true)
| - Product_Category_1: عدد صحيح (nullable = true)
| - Product_Category_2: عدد صحيح (nullable = true)
| - Product_Category_3: عدد صحيح (nullable = true)
| - شراء: عدد صحيح (nullable = true)
بعد قراءة ملف csv ، يمكننا أن نرى أننا حصلنا بدقة على نوع البيانات أو مخطط كل عمود في إطار البيانات.
- عرض أول ن الملاحظة
لرؤية الملاحظة n الأولى ، يمكن للمرء استخدام عملية الرأس. عملية رأس Pandas هي نفسها مثل عملية رأس PySpark.
ترين.هيد (5)
انتاج:
[Row (User_ID = 1000001، Product_ID = u'P00069042 ′، Gender = u'F '، Age = u'0-17 ′، Occupation = 10، City_Category = u'A'، Stay_In_Current_City_Years = u'2 ′، Marital_Status = 0، Product_Category_1 = 3، Product_Category_2 = لا شيء، Product_Category_3 = لا شيء، شراء = 8370)،
الصف (User_ID = 1000001 ، Product_ID = u'P00248942 ′ ، الجنس = u'F '، العمر = u'0-17 ′ ، المهنة = 10 ، City_Category = u'A' ، Stay_In_Current_City_Years = u'2 ′ ، Marital_Status = 0 ، Product_Category_1 = 1، Product_Category_2 = 6، Product_Category_3 = 14، شراء = 15200)،
الصف (User_ID = 1000001 ، Product_ID = u'P00087842 ′ ، الجنس = u'F '، العمر = u'0-17 ′ ، الوظيفة = 10 ، City_Category = u'A' ، Stay_In_Current_City_Years = u'2 ′ ، Marital_Status = 0 ، Product_Category_1 = 12، Product_Category_2 = بلا، Product_Category_3 = لا شيء، شراء = 1422)،
الصف (User_ID = 1000001 ، Product_ID = u'P00085442 ′ ، الجنس = u'F '، العمر = u'0-17 ′ ، المهنة = 10 ، City_Category = u'A' ، Stay_In_Current_City_Years = u'2 ′ ، Marital_Status = 0 ، Product_Category_1 = 12، Product_Category_2 = 14، Product_Category_3 = لا شيء، شراء = 1057)،
الصف (User_ID = 1000002 ، Product_ID = u'P00285442 ′ ، الجنس = u'M '، العمر = u'55 +' ، الوظيفة = 16 ، City_Category = u'C '، Stay_In_Current_City_Years = u'4 +' ، Marital_Status = 0 ، Product_Category_1 = 8، Product_Category_2 = بلا، Product_Category_3 = بلا، شراء = 7969)]
سنستخدم الآن عملية show لرؤية النتيجة بطريقة أفضل لأن النتائج ستأتي في شكل صف. يمكننا أيضًا اقتطاع النتيجة باستخدام الوسيطة truncate = True.
train.show (2 ، اقتطاع = صحيح)
انتاج:
+ ——- + ———- + —— + —- + ———- + ————- + ————————– + ————– + —————— + + —————— + —————— + ——– +
| معرف المستخدم | معرف_المنتج | الجنس | العمر | الوظيفة | المدينة_الفئة | الإقامة_في_الحالية_المدينة_السنة | الحالة_العرقية | Product_Category_1 | Product_Category_2 | Product_Category_3 | شراء |
+ ——- + ———- + —— + —- + ———- + ————- + ————————– + ————– + —————— + + —————— + —————— + ——– +
| 1000001 | P00069042 | ف | 0-17 | 10 | أ | 2 | 0 | 3 | فارغ | فارغ | 8370 |
| 1000001 | P00248942 | ف | 0-17 | 10 | أ | 2 | 0 | 1 | 6 | 14 | 15200 |
+ ——- + ———- + —— + —- + ———- + ————- + ————————– + ————– + —————— + + —————— + —————— + ——– +
إظهار الصفين العلويين فقط
- حساب عدد صفوف DataFrame
لحساب عدد الصفوف في إطار البيانات ، يمكننا استخدام عملية العد. سنقوم الآن بحساب عدد صفوف ملفات الاختبار وتدريب الملفات من خلال تطبيق عملية العد.
train.count () ، test.count ()
انتاج:
(233598 ، 550069)
لدينا 233598 ، 550069 ، صفوف في الاختبار والتدريب ، على التوالي.
- الحصول على عدد العمود واسم الأعمدة من ملف الاختبار والتدريب
على غرار تشغيل العمود في DataFrame of pandas ، سنستخدم عملية الأعمدة للحصول على اسم العمود. الآن سنقوم أولاً بطباعة no. العمود واسم العمود من ملف الاختبار وملف التدريب.
لين (أعمدة القطار) ، أعمدة القطار
انتاج:
12 ['User_ID'، 'Product_ID'، 'Gender'، 'Age'، 'Occupation'، 'City_Category'، 'Stay_In_Current_City_Years'، 'Marital_Status'، 'Product_Category_1'، 'Product_Category_2'، 'Product_Category_3'، 'Purchase']
الآن نقوم بذلك لملف الاختبار بالمثل.
لين (أعمدة الاختبار) ، أعمدة الاختبار
انتاج:
13 [”، 'User_ID'، 'Product_ID'، 'Gender'، 'Age'، 'Occupation'، 'City_Category'، 'Stay_In_Current_City_Years'، 'Marital_Status'، 'Product_Category_1'، 'Product_Category_2'، 'Product_Category_3'، 'Comb "]
بعد الإخراج أعلاه ، يمكننا أن نرى أن هناك 12 عمودًا في ملف التدريب و 13 عمودًا في ملف الاختبار. من الناتج أعلاه ، يمكننا التحقق من وجود 13 عمودًا في ملف الاختبار و 12 عمودًا في ملف التدريب. العمود "Comb" هو العمود الوحيد في ملف الاختبار ، ولا يوجد "شراء" غير موجود في ملف الاختبار. يوجد عمود آخر في ملف الاختبار يمكننا أن نرى أنه لا يحتوي على أي اسم للعمود.
- الحصول على إحصاءات موجزة مثل العد ، الحد الأقصى ، الحد الأدنى ، الانحراف المعياري ، يعني في الأعمدة الرقمية في DataFrame
في DataFrame ، سنستخدم العملية المسماة وصف العملية. يمكننا حساب العمود العددي والحصول على ملخص إحصائي باستخدام وصف العملية. سيتم حساب جميع الأعمدة الرقمية في DataFrame ، ولا يوجد اسم عمود محدد في حساب الإحصائيات الموجزة.
train.describe (). show ()
انتاج:
+ ——- + —————— + —————– + ——————- + —————— + —————— + —————— + —— ———— +
| ملخص | معرف المستخدم | المهنة | Marital_Status | Product_Category_1 | Product_Category_2 | Product_Category_3 | شراء |
+ ——- + —————— + —————– + ——————- + —————— + —————— + —————— + —— ———— +
| العد | 550068 | 550068 | 550068 | 550068 | 376430 | 166821 | 550068 |
| يعني | 1003028.8424013031 | 8.076706879876669 | 0.40965298835780306 | 5.404270017525106 | 9.842329251122386 | 12.668243206790512 | 9263.968712959126 |
| stddev | 1727.5915855308265 | 6.522660487341778 | 0.4917701263173273 | 3.9362113692014082 | 5.086589648693526 | 4.125337631575267 | 5023.0653938206015 |

| دقيقة | 1000001 | 0 | 0 | 1 | 2 | 3 | 12 |
| ماكس | 1006040 | 20 | 1 | 20 | 18 | 18 | 23961 |
+ ——- + —————— + —————– + ——————- + —————— + —————— + —————— + —— ———— +
في وصف العملية ، هذا ما نحصل عليه عند تحديد اسم عمود السلسلة أو اسم العمود الفئوي.
train.describe ('Product_ID'). show ()
انتاج:
+ ——- + ———- +
| ملخص | معرف المنتج |
+ ——- + ———- +
| العد | 550068 |
| يعني | فارغ |
| stddev | فارغ |
| دقيقة | P00000142 |
| ماكس | P0099942 |
+ ——- + ———- +
استنادًا إلى ASCII ، القيم القصوى والدقيقة المحسوبة. يتم استخدام عملية الوصف للعمل على عمود نوع السلسلة.
- تحديد عمود DataFrame
سنستخدم اسم الأعمدة في عملية التحديد لتحديد العمود. سنذكر اسم العمود مع الفصل باستخدام الفواصل. الآن سنرى كيف يتم اختيار "Age" و "User_ID" من ملف التدريب.
- train.select ("User_ID"، "العمر"). show (5)
- انتاج:
- + ——- + —- +
- | معرف المستخدم | العمر |
- + ——- + —- +
- | 1000001 | 0-17 |
- | 1000001 | 0-17 |
- | 1000001 | 0-17 |
- | 1000001 | 0-17 |
- | 1000002 | 55+ |
- + ——- + —- +
- إيجاد منتج مميز لا. في ملفات الاختبار وملفات التدريب
لحساب رقم DataFrame. من الصفوف المميزة ، سنستخدم العملية المميزة . الآن سنقوم بتطبيق عملية مميزة لحساب لا. منتج متميز في ملف الاختبار والتدريب.
train.select ("Product_ID"). مميز (). count () ، test.select ("Product_ID"). مميز (). count ()
انتاج:
(3633 ، 3492)
لدينا 3492 و 3633 منتجًا متميزًا في ملف الاختبار والتدريب ، على التوالي. نحن نعلم الآن أنه في ملف التدريب ، لدينا قيم مميزة أكثر من ملف الاختبار حيث يمكننا التعلم من نتيجة الإخراج. سنستخدم الآن عملية الطرح لمعرفة فئات Product_ID غير الموجودة في ملف التدريب ولكنها موجودة في ملف الاختبار. نفس الشيء الذي يمكن للمرء أن يفعله أيضًا لجميع ميزات الفئوية.
diff_cat_in_train_test = test.select ('Product_ID'). طرح (train.select ('Product_ID'))
diff_cat_in_train_test.distinct (). count () # لعدد مميز
انتاج:
46
لذلك من النتيجة أعلاه ، يمكننا أن نعرف أن هناك 47 فئة مختلفة ، غير موجودة في ملف التدريب ولكنها موجودة في ملف الاختبار. سيتم تخطي البيانات أو جمعها من ملف الاختبار غير الموجود في ملف القطار.
- حساب تكرار أزواج الأعمدة الفئوية؟
دعونا نقوم بحساب التردد الزوجي للعمود في DataFrame باستخدام العملية يمكن أن يكون الجدول الترافقي. الآن دعونا نحسب عمودي "الجنس" و "العمر" في DataFrame للقطار من خلال تطبيق عملية الجدول الترافقي .
train.crosstab ("Age"، "Gender"). show ()
انتاج:
+ ———- + —– + —— +
| Age_Gender | F | م |
+ ———- + —– + —— +
| 0-17 | 5083 | 10019 |
| 46-50 | 13199 | 32502 |
| 18-25 | 24628 | 75032 |
| 36-45 | 27170 | 82843 |
| 55+ | 5083 | 16421 |
| 51-55 | 9894 | 28607 |
| 26-35 | 50752 | 168835 |
+ ———- + —– + —— +
القيمة المميزة للجنس هي اسم العمود ، والمقدار المختلف للعمر هو اسم الصف ، والذي يمكن رؤيته في النتيجة أعلاه. في الجدول ، سيكون عدد الزوج صفرًا إذا لم يحدث.
كيفية الحصول على DataFrame مع صفوف فريدة؟
للعثور على صفوف فريدة وعدم تضمين صفوف مكررة ، سنستخدم عملية DropDuplicates . سيحصل على Dataframe بدون أي صفوف مكررة عن طريق إسقاط الصفوف المكررة من DataFrame. يرجى التحقق هنا لمعرفة كيفية تنفيذ إجراء DropDuplicates للحصول على جميع الصفوف الفريدة للأعمدة.
train.select ("العمر" ، "الجنس"). dropDuplicates (). show ()
انتاج:
+ —– + —— +
| العمر | الجنس |
+ —– + —— +
| 51-55 | F |
| 51-55 | م |
| 26-35 | F |
| 26-35 | م |
| 36-45 | F |
| 36-45 | م |
| 46-50 | F |
| 46-50 | م |
| 55+ | F |
| 55+ | م |
| 18-25 | F |
| 0-17 | F |
| 18-25 | م |
| 0-17 | م |
+ —– + —— +
- كيفية إسقاط الصفوف سوف قيمة فارغة؟
إذا أراد المرء إسقاط جميع الصفوف التي لها قيمة فارغة ، فيمكننا استخدام العملية المسماة عملية الإسقاط . لإسقاط صف من DataFrame ، فإنه يأخذ في الاعتبار ثلاثة خيارات.
- مجموعة فرعية - هي قائمة بجميع أسماء الأعمدة التي يجب مراعاتها لتشغيل إسقاط العمود بقيم فارغة.
- Thresh - يساعد هذا في إسقاط الصفوف التي تحتوي على قيم أقل من عتبة غير فارغة. بشكل افتراضي ، لا شيء محدد في هذا.
- كيف - يمكن استخدامه في نوعين - الكل أو أي نوع. باستخدام أي منها ، سيتم إسقاط الصف إذا كانت أي قيمة في الصف خالية. باستخدام all ، سيتم تقليل الصف إذا كانت جميع قيم الصفوف خالية.
الآن سنستخدم كل هذه الخيارات واحدًا تلو الآخر لإسقاط الصفوف الفارغة باستخدام الخيارات الافتراضية مثل المجموعة الفرعية ، والعتبة ، ولا شيء لكيفية ، ولا شيء ، ولا شيء.
train.dropna (). count ()
انتاج:
166821
- كيف تملأ القيم الخالية في DataFrame برقم ثابت؟
لملء القيم الخالية مع رقم ثابت. سوف نستخدم عملية تعبئة هنا. هناك معلمتان يجب مراعاتهما من خلال عملية fillna لملء القيم الخالية.
- مجموعة فرعية: هنا ، يحتاج المرء إلى تحديد الأعمدة التي يجب مراعاتها لتعبئة القيم.
- القيمة: هنا ، يمكننا أن نذكر المقدار الذي سيتم استبداله بالقيمة ، والتي يمكن أن تكون أي نوع بيانات مثل سلسلة ، عائم ، عدد صحيح في جميع الأعمدة.
سنقوم هنا بملء "-1" بدلاً من القيم الخالية في قطار DataFrame.
train.fillna (-1). شو (2)
انتاج:
+ ——- + ———- + —— + —- + ———- + ————- + ————————– + ————– + —————— + + —————— + —————— + ——– +
| معرف_المستخدم | معرف_المنتج | الجنس | العمر | الوظيفة | المدينة_الفئة | الإقامة_في_الحالية_المدينة_السنة | الحالة_العرقية | Product_Category_1 | Product_Category_2 | Product_Category_3 | شراء |
+ ——- + ———- + —— + —- + ———- + ————- + ————————– + ————– + —————— + + —————— + —————— + ——– +
| 1000001 | P00069042 | ف | 0-17 | 10 | أ | 2 | 0 | 3 | -1 | -1 | 8370 |
| 1000001 | P00248942 | ف | 0-17 | 10 | أ | 2 | 0 | 1 | 6 | 14 | 15200 |
+ ——- + ———- + —— + —- + ———- + ————- + ————————– + ————– + —————— + + —————— + —————— + ——– +
إظهار الصفين العلويين فقط
خاتمة
تكتسب PySpark زخمًا في عالم الذكاء الاصطناعي والتعلم الآلي. يتم استخدام PySpark لحل مشكلة التعلم الآلي في العالم الحقيقي. يمكنك إنشاء RDD من مصادر بيانات مختلفة خارجية وموجودة على حد سواء والقيام بجميع أنواع التحويلات عليه. آمل أن تكون هذه المقالة مفيدة وتمكنت من إعطائك رؤى عميقة حول إطارات بيانات PySpark.
إذا كنت مهتمًا بالتعرف على PySpark وأدوات علوم البيانات الأخرى ، فراجع دبلوم PG في IIIT-B & upGrad في علوم البيانات والذي تم إنشاؤه للمهنيين العاملين ويقدم أكثر من 10 دراسات حالة ومشاريع ، وورش عمل عملية عملية ، وإرشاد مع خبراء الصناعة ، وجهاً لوجه مع موجهين في الصناعة ، وأكثر من 400 ساعة من التعلم والمساعدة في العمل مع الشركات الكبرى.
هل PySpark أكثر كفاءة من Pandas؟
نعم ، يعد PySpark أسرع من Pandas ، بل إنه يتفوق على Pandas في اختبار قياس الأداء. بعبارات أساسية ، تقوم Pandas بعمليات على جهاز واحد ، بينما تنفذ PySpark العمليات عبر العديد من الأجهزة. إذا كنت تعمل على تطبيق Machine Learning مع مجموعة بيانات ضخمة ، فإن PySpark هو الخيار المثالي ، حيث يمكنه تنفيذ عمليات أسرع 100 مرة من Pandas. بسبب JVM ، فإن لغة البرمجة Scala أسرع 10 مرات من Python لتحليل البيانات ومعالجتها. عندما يتم استخدام كود برمجة Python لإجراء مكالمات إلى مكتبات Spark ، تكون النتائج متواضعة.
ما هي بعض عيوب استخدام Apache PySpark؟
لا يمتلك Spark نظام إدارة الملفات الخاص به. نظرًا لارتفاع تكلفة الذاكرة الإضافية المطلوبة لتشغيل Spark ، فقد تكون الحوسبة في الذاكرة باهظة التكلفة. عند استخدام Apache Spark مع Hadoop ، يواجه المطورون صعوبات في الملفات المضغوطة. تتكرر البيانات على دفعات في Spark ، مع تخطيط كل تكرار ومعالجته بشكل مستقل. في Apache Spark ، يتم تقسيم البيانات إلى مجموعات أصغر في فترة زمنية محددة مسبقًا. نتيجة لذلك ، لن تدعم Apache معايير النافذة المستندة إلى السجلات. وبدلاً من ذلك يوفر معايير نافذة تستند إلى الوقت.
كيف تختلف مجموعات البيانات و DataFrame و RDD عن بعضها البعض؟
RDD عبارة عن مجموعة مجمعة من عناصر البيانات المشتتة عبر أجهزة كمبيوتر متعددة. يتم تمثيل البيانات عبر RDDs ، وهي عبارة عن مجموعة من كائنات Java أو Scala. يعد DataFrame مجموعة من البيانات المنظمة في أعمدة مسماة تنتشر عبر العديد من الخوادم. في قاعدة البيانات العلائقية ، تكون مكافئة من الناحية المفاهيمية للجدول. Dataset هو امتداد لواجهة برمجة التطبيقات لإطار البيانات الذي يوفر إمكانية واجهة البرمجة الموجهة للكائنات والآمنة من نوع RDD. يعد DataFrame مجموعة موزعة من البيانات ، تشبه RDD ، ولا يمكن تغييرها. يتم تنظيم البيانات في أعمدة مسماة ، على غرار جدول في قاعدة بيانات علائقية ، بدلاً من RDD. عندما يتعلق الأمر بمهام بسيطة مثل تجميع البيانات ، يكون RDD أبطأ من كل من Dataframes ومجموعات البيانات. يحتوي على واجهة برمجة تطبيقات بسيطة لأداء المهام الإجمالية. يمكنه تجميع البيانات بشكل أسرع من RDDs ومجموعات البيانات.