2017-02-15 2 views
1

Я пытаюсь обработать файл с искровым кодом, но у моего входного файла есть одна «запись» информации, распространяемая на 3 строки.Spark читает многострочные записи со сдвигомRDD

Rec1 Line1 
Rec1 Line2 
Rec1 Line3 
Rec2 Line1 
Rec2 Line2 
Rec2 Line3 

Там нет ключа связывающего строки записи, единственное соединение, что три линии рядом друг с другом. Нет разделителя записей, кроме того, что 4-я строка - это начало новой записи. Все остальные вопросы, которые я видел, связанные с многострочными записями, похоже, имеют какой-то очевидный разделитель записей, в то время как у меня нет ни одного в этом случае, я должен полагаться на количество строк.

Моя первая мысль заключается в использовании функции sliding из org.apache.spark.mllib.rdd.RDDFunctions

sc.textFile("myFile.txt").sliding(3,3) 

Это превращает мой РДД [String] в и РДД [Array [String]], где каждый элемент в РДУ 3 строки из файла ,

В некоторых тестах это выглядит так, как будто это работает, и получает результат, который я хочу, однако я замечаю, что функция sliding фактически вызывает collect во время оценки. Меня это беспокоит, что он собирает? Это весь файл данных или что-то еще? Мой файл будет слишком большим, чтобы собрать всю вещь в драйвере.

Это sliding лучший способ прочитать этот файл, или есть более эффективный способ сделать это?

+0

Нельзя использовать rdd.map (_. Split ("")). Map (arr => (arr [0], arr [1])). GroupBy (_._ 2)? Это означает разделение вашей строки пробелом, создание rdd ключа, значения и группового ключа. – dumitru

+0

@dumitru Нет ключа в файле для groupBy. Я мог бы использовать 'zipWithIndex' для получения ключей для группировки. Это также приводит к полной перетасовке. – puhlen

ответ

1

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

Я узнал об этом, прочитав код в org.apache.spark.mllib.rdd.SlidingRDD в Spark 2.0.2.

Для вашей цели .sliding представляется лучшим выбором.