Spark (Java): получение пар «имя файла/содержимое» из списка имен файлов.

В настоящее время я работаю над проектом Spark на Java и столкнулся с проблемой, которую не знаю, как решить. Я не знаком с различными методами объединения/объединения, поэтому думаю, что один из них и есть ответ.

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

Я знаю, что могу использовать стандартную Java для получения текстового содержимого и просто ввести список кортежей с именами файлов, но я чувствую, что для этого должен быть способ "Spark".

Я также знаю, что существует метод fullTextFile, но он захватывает только все в каталоге, и я не уверен, что это будет тот формат, который я получу (например, я мог бы использовать 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. Они не загружают всю строку как один объект, они разбивают ее по строкам. Это заставляет меня переосмыслить свой подход, так как по разным причинам мне нужны вещи, которые выходят за рамки. Поэтому я думаю, что мне нужно использовать «хакерский» подход с использованием искры для загрузки файла, а затем преобразовать его обратно в список. Однако я оставлю этот вопрос на случай, если у кого-то есть умное решение для этого.


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


Ответы (3)


Вместо этого я собираюсь переключиться на fullTextFiles(), так как сталкиваюсь со все большим количеством проблем, пытаясь преобразовать данные в правильный формат.

А именно, я на самом деле не хочу, чтобы файлы были разбиты на строки, я хочу разбить его особым образом сам.

person Chris Chambers    schedule 11.03.2015
comment
Мне пришлось переключиться обратно, у fullTextFiles() есть проблемы с 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