在 SPARK 中操作 RDD,将行合并到逐行分隔符中



我有来自以下文件的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...

有人可以帮忙吗?

如果文本文件具有您解释的格式,则可以实现自定义数据源。在此处查看示例

我做了什么:

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(_))

最新更新