【问题标题】:Saving to a custom output format in Spark / Hadoop在 Spark / Hadoop 中保存为自定义输出格式
【发布时间】:2018-06-30 06:36:31
【问题描述】:

我有一个包含多个数据结构的 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 只有两个选项,另存为文本文件或目标文件,据我所知,它们都不支持我自定义格式。我该怎么做呢?

【问题讨论】:

    标签: scala hadoop apache-spark rdd


    【解决方案1】:

    您可以只 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)
    

    【讨论】:

    • 哇,这真的很聪明,让它变得如此简单和容易!非常感谢:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-07
    相关资源
    最近更新 更多