在Spark / Hadoop中保存为自定义输出格式

时间:2018-01-21 14:29:11

标签: scala hadoop apache-spark rdd

我有一个包含多个数据结构的RDD,而其中一个数据结构是Map[String, Int]

为了使其易于可视化,我在地图转换后得到以下内容:

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_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作为某种标题,然后是内容,一行空格,然后是下一个元素。

对于我的问题,data RDD只有两个选项,另存为文本文件或目标文件,我认为这两个选项都不支持我自定义格式。我怎么能这样做?

1 个答案:

答案 0 :(得分:3)

您可以mapString并撰写结果。例如:

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)