scala - شرارة textFile مقابل wholeTextFiles
apache-spark file-io (3)
أفهم النظرية الأساسية
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
؟
textFile
قسم إنشاءwholeTextFiles
لكل ملف ، بينما ينشئwholeTextFiles
RDD من قيم الزوج
هذا غير دقيق:
-
textFile
بتحميلtextFile
واحد أو أكثر ، مع كل سطر كسجل في RDD الناتج. قد يتم تقسيم ملف واحد إلى عدة أقسام إذا كان الملف كبيرًا بما يكفي (يعتمد على عدد الأقسام المطلوبة ، وعدد الأقسام الافتراضية في Spark ، ونظام الملفات الأساسي). عند تحميل ملفات متعددة مرة واحدة ، "تفقد" هذه العملية العلاقة بين السجل والملف الذي يحتوي عليه - أي لا توجد طريقة لمعرفة أي ملف يحتوي على أي سطر. سيتبع ترتيب السجلات في RDD الترتيب الأبجدي للملفات ، وترتيب السجلات داخل الملفات (لم يتم "فقد" الترتيب). -
wholeTextFiles
يحافظ على العلاقة بين البيانات والملفات التي تحتوي عليها ، عن طريق تحميل البيانات فيPairRDD
مع سجل واحد لكل ملف إدخال . سيكون للسجل النموذج(fileName, fileContent)
. هذا يعني أن تحميل الملفات الكبيرة محفوف بالمخاطر (قد يتسبب في أداء سيء أوOutOfMemoryError
لأن كل ملف سيتم تخزينه بالضرورة على عقدة واحدة). يتم التقسيم استنادًا إلى إدخال المستخدم أو تكوين Spark - مع إمكانية تحميل ملفات متعددة في قسم واحد.
بشكل عام ، يخدم
textFile
حالة الاستخدام الشائعة المتمثلة في مجرد تحميل الكثير من البيانات (بغض النظر عن كيفية تقسيمها إلى ملفات).
يجب استخدام
readWholeFiles
فقط إذا كنت بحاجة فعليًا إلى معرفة اسم الملف الأصلي لكل سجل ، وإذا كنت تعرف أن جميع الملفات صغيرة بما يكفي.
-
textfile () يقرأ ملف نصي وإرجاع RDD سلاسل. على سبيل المثال ، ستنشئ sc.textFile ("/ mydata.txt") RDD حيث يكون كل سطر على حدة عنصرًا.
-
يقرأ wholeTextFile () دليلاً للملفات النصية ويعيد pairRDD. على سبيل المثال ، إذا كان هناك عدد قليل من الملفات في دليل ، فإن طريقة wholeTextFile () ستقوم بإنشاء زوج RDD مع اسم الملف والمسار كمفتاح ، والقيمة هي الملف بأكمله كسلسلة.
الاختلاف الرئيسي ، كما ذكرت ، هو أن
textFile
سيعيد RDD مع كل سطر كعنصر بينما ترجع wholeTextFiles PairRDD مع أن يكون المفتاح هو مسار الملف.
إذا لم تكن هناك حاجة لفصل البيانات وفقًا للملف ، ما
textFile
سوى استخدام
textFile
.
عند قراءة الملفات غير المضغوطة باستخدام
textFile
، سيتم تقسيم البيانات إلى مجموعات بحجم 32 ميجابايت.
هذا advantagous من منظور الذاكرة.
هذا يعني أيضًا أنه يتم فقد ترتيب الأسطر ، إذا كان ينبغي الحفاظ على
wholeTextFiles
فيجب استخدام
wholeTextFiles
.
سيقوم
wholeTextFiles
بقراءة المحتوى الكامل للملف مرة واحدة ، ولن يتم
wholeTextFiles
جزئيًا على القرص أو تجميع البيانات المهملة جزئيًا.
سيتم التعامل مع كل ملف بواسطة نواة واحدة وستكون البيانات الخاصة بكل ملف جهازًا واحدًا مما يجعل من الصعب توزيع الحمل.