Я пытаюсь обработать файл с искровым кодом, но у моего входного файла есть одна «запись» информации, распространяемая на 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
лучший способ прочитать этот файл, или есть более эффективный способ сделать это?
Нельзя использовать rdd.map (_. Split ("")). Map (arr => (arr [0], arr [1])). GroupBy (_._ 2)? Это означает разделение вашей строки пробелом, создание rdd ключа, значения и группового ключа. – dumitru
@dumitru Нет ключа в файле для groupBy. Я мог бы использовать 'zipWithIndex' для получения ключей для группировки. Это также приводит к полной перетасовке. – puhlen