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

标签 scala hadoop apache-spark rdd

我有一个包含多个数据结构的 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/

相关文章:

scala - 过滤 Scala 的并行集合,并在找到所需数量的结果时提前中止

hadoop - 为 S3 提供基于 Hadoop/Spark IAM 角色的访问的正确方法是什么?

hadoop - 名称节点 HA (UnknownHostException : nameservice1)

scala - 从 scala 中的 map((tuple),(tuple)) 中读取元组的各个元素

python - 何时在 PySpark 中使用 UDF 与函数?

Scala-奇怪的编译错误(方法的多个重载替代定义默认参数)

java - 对数据摄取Hadoop感到困惑

scala - 如何将字符串连接到 Spark 中的列?

scala - 从 Scala 的 MutableList 中删除元素

hadoop - Hortonwork 在 vmware 中安装后无法与浏览器连接