我有一个包含多个数据结构的 RDD,而这些数据结构之一是 Map[String, Int]
。
为了便于可视化,我在 map 转换后得到以下内容:
val data = ... // This is a RDD[Map[String, Int]]
在这个 RDD 的一个元素中,Map 包含以下内容:
*key value*
map_id -> 7753
Oscar -> 39
Jaden -> 13
Thomas -> 1
Chris -> 52
然后在RDD的其他元素中包含其他名称和数字,每个map包含一个特定的map_id
。无论如何,如果我简单地执行 data.saveAsTextFile(path)
,我将在我的文件中获得以下输出:
Map(map_id -> 7753, Oscar -> 39, Jaden -> 13, Thomas -> 1, Chris -> 52)
Map(...)
Map(...)
但是,我想将其格式化为以下格式:
---------------------------
map_id: 7753
---------------------------
Oscar: 39
Jaden: 13
Thomas: 1
Chris: 52
---------------------------
map_id: <some other id>
---------------------------
Name: nbr
Name2: nbr2
基本上,map_id
作为某种 header ,然后是内容,一行空格,然后是下一个元素。
对于我的问题,data
RDD 只有两个选项,另存为文本文件或对象文件,据我所知,这两者都不支持我自定义格式。我该怎么做呢?
最佳答案
您可以将映射
到String
并写入结果。例如:
def format(map: Map[String, Int]): String = {
val id = map.get("map_id").map(_.toString).getOrElse("unknown")
val content = map.collect {
case (k, v) if k != "map_id" => s"$k: $v"
}.mkString("\n")
s"""|---------------------------
|map_id: $id
|-------------------------------
|$content
""".stripMargin
}
data.map(format(_)).saveAsTextFile(path)
关于scala - 在 Spark/Hadoop 中保存为自定义输出格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48367879/