Как разобрать файл с фиксированной позицией с несколькими разделами в Spark с помощью Scala

Я новичок в stackoverflow (постоянный читатель, но сейчас хочу поучаствовать). Я также новичок в Scala, Spark и функциональном программировании. Будем рады внести свой вклад и учиться на всех фронтах.

мой вопрос:

Я работаю с переменной длиной записи (несколько разделов в файле) с полями фиксированной позиции (также известной как фиксированная ширина - где формат определяется шириной столбца). Например, макет myfile.txt (начиная с 1): 1-5 = столбец 1, 5-6 = столбец 2, 6-20 = столбец 3 и 20-28 = столбец 4; тогда как от sub-header-a2 до sub-footer-z2 имеет совершенно другой макет 1-3 = столбец 1, 3-6 = столбец 2 и 6-11 = столбец 3

Пример myfile.txt:

header
sub-header-a1
1234a Mr. John Doe 19770101
4321a Mrs. Jane Doe19770101
sub-footer-z1
sub-header-a2
1203400001
4302100001
sub-footer-z2
footer

Используя Spark / Scala, я хочу выбрать раздел от подзаголовка-a1 до подзаголовка-z1 в одном RDD, а другой раздел - во втором RDD для дальнейшей обработки (без подзаголовка / нижнего колонтитула). Два отдельных RDD должны быть созданы из baseRDDInput.

Первый RDD

1234a Mr. John Doe 19770101
4321a Mrs. Jane Doe19770101

Второй СДР

1203400001
4302100001

Я много и мало искал примеры кода для выбора диапазона из базового RDD и преобразования в другой RDD. Нашел это, но у меня есть a StringRDD, и я не получаю часть RangePartitioner. Все остальные примеры чтения файлов, которые я нашел, всегда относятся к CSV и не имеют вложенных разделов.

Вот что у меня есть на данный момент:

// created a base RDD from raw file, I assumed that I need an index  
val baseRDDinput = sc.textFile("myfile.txt") zipWithIndex () 

// get the start and end point of my range
val (start, end) = ("sub-header-a1", "sub-footer-z1")

// get the index of start and end point
??? 

// iterator over index in order (index is stable based on comments https://stackoverflow.com/questions/26828815/how-to-get-element-by-index-in-spark-rdd-java) and select elements between start and end index and create RDD-1 then do the same with next section. 
???

// next based on code examples from (https://stackoverflow.com/questions/8299885/how-to-split-a-string-given-a-list-of-positions-in-scala) I will parse the element and  make k/v using the first column of file as the key

Мы будем очень благодарны за любые предложения по подходу и / или коду. Мне просто нужен толчок в правильном направлении. Заранее спасибо.

ОБНОВЛЕНИЕ: исправлены ссылки


person rburg    schedule 05.08.2015    source источник


Ответы (1)


Вы ошибаетесь с подходом к хранению данных таким образом, вам нужно иметь 2 отдельных файла вместо того, чтобы помещать все в один файл.

В этой статье (http://0x0fff.com/spark-hdfs-integration/) я У вас есть пример использования Hadoop InputFormats для чтения данных из HDFS в Spark. Вам нужно использовать org.apache.hadoop.mapreduce.lib.input.TextInputFormat, он вернет вам пару значений - первое - это Long, представляющее смещение от начала файла, второе - это строка из самого файла. Таким образом, вы можете найти строки со значениями «sub-header-a1», «sub-footer-a1» и т. Д., Запомнить их смещения и отфильтровать поверх них, чтобы сформировать 2 отдельных RDD

person 0x0FFF    schedule 06.08.2015
comment
Спасибо @ 0x0FFF. Я должен был быть более ясным в описании своих проблем. Буду обновлять. RDD-1 и RDD-2 представляют собой два отдельных RDD, созданных из baseRDDinput. Рассмотрю статью. Спасибо. - person rburg; 06.08.2015