我有一个按密钥(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")
在这种情况下如何设法做到这一点?
答案 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"
}
}