Управляйте СДР в SPARK, объединяйте строки в блок с разделителем строк - PullRequest
1 голос
/ 23 сентября 2019

У меня есть копия данных RDD из следующего файла, я хочу объединить строки на основе разделителя строк, чтобы я мог получить RDD [Person].

case class Person(id: String, name: String, job: String)

--------------
id : 1
name : amy
job : teacher
--------------
id : 2
name : bob
job : nurse
--------------
id : 3
name : charlie
job : policeman
--------------

Обратите внимание, что файл данных огромен и не может поместиться в памяти, поэтому вы не можете сделать что-то вроде

val lines = sc.textFile("/path/to/file")
val person = lines.collect...

Кто-нибудь может помочь?

Ответы [ 2 ]

0 голосов
/ 26 сентября 2019

Что я сделал:

val linesRdd = sc.textFile("/path/to/file")
val lineSeparator = "--------------"
var lastSeparatorIndex = 0

val personLinesRdd: RDD[String] = linesRdd
  .zipWithIndex
  .map{ case(line, index) =>
    if(line == lineSeparator) lastSeparatorIndex = index
    (line, lastSeparatorIndex)
  }

val personSlicesRdd: RDD[Seq[String] = personLinesRdd
  .groupBy{case (index, _) => index}
  .map{ case (_, lines) => lines.toSeq.map { case (line, _) => line }}
  .filter(_.nonEmpty)

val persons: RDD[Person] = personSlicesRdd.map(toPerson(_))
0 голосов
/ 23 сентября 2019

Если ваш текстовый файл имеет формат, который вы объясняете, вы можете реализовать пользовательский источник данных.Смотрите пример здесь

...