如何将分组的Spark RDD内容拼合为单独的行然后保存到文件

时间:2017-10-16 05:55:20

标签: scala apache-spark rdd

我有一个按密钥(index:Int)分组的RDD [(Int,Iterable [Coordinates])]。坐标是一个由成员组成的班级:

  

纬度:双倍,经度:双倍

我想创建打印或创建一个csv文件,它将采用以下形式(每个数据点一行):

index,latitude,longitude

使用未分组的RDD [(Int,Coordinates)],它的工作方式如下:

val textOutputRDD = initialRDD.map(
  f => f._1.toString() + "," + f._2.latitude.toString() + "," + f._2.longitude.toString())
textOutputRDD.saveAsTextFile("TextOutput")

在这种情况下如何设法做到这一点?

2 个答案:

答案 0 :(得分:2)

尝试使用flatmap -

val output = rdd.flatMap(s=>{
      val list=List[String]()
      for (latlon <- s._2) {
        list.addString(s._1.toString() + "," + latlon.latitude.toString() + "," + latlon.longitude.toString())
      }
      return list
    })
output.save(....)

答案 1 :(得分:1)

一个简单的嵌套循环就可以了。在这里,我用一对简单的双精度逼近坐标:

val rdd =
  sc.parallelize(
    Seq(
      1 -> Seq((4.1, 3.4), (5.6, 6.7), (3.4, 9.0)),
      2 -> Seq((0.4, -4.1), (-3.4, 6.7), (7.0, 8.9))
    )
  )

val csvLike =
  for ((key, coords) <- rdd; (lat, lon) <- coords) yield s"$key,$lat,$lon"

for (row <- csvLike) println(row)

此代码将产生以下输出:

2,0.4,-4.1
2,-3.4,6.7
2,7.0,8.9
1,4.1,3.4
1,5.6,6.7
1,3.4,9.0

修改

另一种可能的方法是交换实际的flatMap / map序列,编译器将for理解转换为:

rdd.flatMap {
  case (key, coords) =>
    coords.map {
      case (lat, lon) => s"$key,$lat,$lon"
    }
}