scala - شرارة textFile مقابل wholeTextFiles




apache-spark file-io (3)

textFile قسم إنشاء wholeTextFiles لكل ملف ، بينما ينشئ wholeTextFiles RDD من قيم الزوج

هذا غير دقيق:

  1. textFile بتحميل textFile واحد أو أكثر ، مع كل سطر كسجل في RDD الناتج. قد يتم تقسيم ملف واحد إلى عدة أقسام إذا كان الملف كبيرًا بما يكفي (يعتمد على عدد الأقسام المطلوبة ، وعدد الأقسام الافتراضية في Spark ، ونظام الملفات الأساسي). عند تحميل ملفات متعددة مرة واحدة ، "تفقد" هذه العملية العلاقة بين السجل والملف الذي يحتوي عليه - أي لا توجد طريقة لمعرفة أي ملف يحتوي على أي سطر. سيتبع ترتيب السجلات في RDD الترتيب الأبجدي للملفات ، وترتيب السجلات داخل الملفات (لم يتم "فقد" الترتيب).

  2. wholeTextFiles يحافظ على العلاقة بين البيانات والملفات التي تحتوي عليها ، عن طريق تحميل البيانات في PairRDD مع سجل واحد لكل ملف إدخال . سيكون للسجل النموذج (fileName, fileContent) . هذا يعني أن تحميل الملفات الكبيرة محفوف بالمخاطر (قد يتسبب في أداء سيء أو OutOfMemoryError لأن كل ملف سيتم تخزينه بالضرورة على عقدة واحدة). يتم التقسيم استنادًا إلى إدخال المستخدم أو تكوين Spark - مع إمكانية تحميل ملفات متعددة في قسم واحد.

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

أفهم النظرية الأساسية wholeTextFiles إنشاء wholeTextFiles لكل ملف ، بينما تنشئ wholeTextFiles RDD من قيم الزوج ، حيث يكون المفتاح هو مسار كل ملف ، تكون القيمة هي محتوى كل ملف.

الآن ، من الناحية الفنية ، ما الفرق بين:

val textFile = sc.textFile("my/path/*.csv", 8)
textFile.getNumPartitions

و

val textFile = sc.wholeTextFiles("my/path/*.csv",8)
textFile.getNumPartitions

في كلتا الطريقتين أنا توليد 8 أقسام. فلماذا يجب أن استخدم wholeTextFiles في المقام الأول ، وما الفائدة منه على textFile ؟


  1. textfile () يقرأ ملف نصي وإرجاع RDD سلاسل. على سبيل المثال ، ستنشئ sc.textFile ("/ mydata.txt") RDD حيث يكون كل سطر على حدة عنصرًا.

  2. يقرأ wholeTextFile () دليلاً للملفات النصية ويعيد pairRDD. على سبيل المثال ، إذا كان هناك عدد قليل من الملفات في دليل ، فإن طريقة wholeTextFile () ستقوم بإنشاء زوج RDD مع اسم الملف والمسار كمفتاح ، والقيمة هي الملف بأكمله كسلسلة.


الاختلاف الرئيسي ، كما ذكرت ، هو أن textFile سيعيد RDD مع كل سطر كعنصر بينما ترجع wholeTextFiles PairRDD مع أن يكون المفتاح هو مسار الملف. إذا لم تكن هناك حاجة لفصل البيانات وفقًا للملف ، ما textFile سوى استخدام textFile .

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

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





file-io