Spark (Java): Вземете двойки име на файл/съдържание от списък с имена на файлове

В момента работя върху проект на Spark в Java и се натъкнах на проблем, който не съм сигурен как да разреша. Не съм запознат с различните методи за присъединяване/обединение, така че смятам, че един от тях е отговорът.

В момента искам да въведа списък с имена на файлове (или пътища) и да получа JavaPairRDD обект, състоящ се от двойки имена на файлове/пътища и текстово съдържание.

Знам, че мога да използвам стандартна Java, за да получа текстовото съдържание и просто да въведа списък с кортежи име на файл-съдържание, но смятам, че трябва да има "Spark" начин за това.

Също така знам, че има метод wholeTextFile, но той хваща всичко само в директория и не съм сигурен, че това ще бъде форматът, който получавам (може да използвам Amazon S3 например и не съм сигурен дали мога да направя предположението за директория там).

Освен това съм наясно, че мога да паралелизирам всеки файл поотделно в цикъл, но как да ги съединя отново?

docs = //List<String> of document filenames
JavaRDD<String> documents = sc.parallelize(docs);
JavaPairRDD<String, String> = documents.???

Благодаря предварително.

Редактиране: Изкушавам се да създам JavaPairRDD на <Filename, JavaRDD<String> filecontents>, но не съм сигурен как да продължа оттук нататък. Също така съм предпазлив от това, защото просто звучи погрешно (т.е. преодолявам ли паралелизма по някакъв начин?).

Знам, че мога да накарам Spark да създаде JavaRDD обект от всеки документ, да ги конвертира в List обекти и след това да ги въведе като кортежи, но има ли специфичен за Spark начин да се направи това?

Редактиране 2 Очевидно съм разбрал погрешно как текстовите файлове се зареждат в JavaRDD обект. Те не зареждат целия низ като един обект, те го разделят по ред. Това ме кара да преосмисля подхода си, тъй като имам нужда нещата да се разделят по различни причини. Така че мисля, че трябва да използвам "хакерския" подход на използване на spark за зареждане на файла и след това да го конвертирам обратно в списък. Въпреки това ще оставя въпроса, в случай че някой има умно решение за това.


person Chris Chambers    schedule 11.03.2015    source източник


Отговори (3)


Вместо това ще премина към wholeTextFiles(), тъй като срещам все повече и повече проблеми, опитвайки се да преведа данните в правилния формат.

А именно, всъщност не искам файловете да се разделят на редове, искам сам да го разделя по специален начин.

person Chris Chambers    schedule 11.03.2015
comment
Трябваше да превключа обратно, wholeTextFiles() има проблеми с Amazon S3. - person Chris Chambers; 30.03.2015

Ако използвате метода wholeTestFiles(), не би ли прочел всички данни наведнъж и след това ще ги паралелизира върху вашия самостоятелен клъстер/работници на Spark? Кодът на вашия драйвер трябва да се изпълнява на по-голяма памет.

person Vijayendra Bhati    schedule 29.03.2015

В Scala можете да получите името на файла spark stream или spark sc, като използвате тази заявка:

object GetFileNameFromStream extends java.io.Serializable {
   def getFileName(file: RDD[String]) :String ={
   file.toDebugString
  }
}
person Ram Prasad    schedule 06.12.2018