以特定格式显示输出

时间:2017-10-18 05:04:08

标签: scala dictionary apache-spark output

我对Scala和Spark很陌生,并对输出文件中显示结果有一些疑问。

我实际上有一个Map,其中每个键都与列表列表(Map[Int, List<Double>])相关联,例如:

 (2, List(x1,x2,x3), List(y1,y2,y3), ...).

我应该为每个键显示列表列表中的值,例如:

2     x1,x2,x3
2     y1,y2,y3
1     z1,z2,z3

等等。

当我使用saveAsTextFile函数时,它不会在输出中提供我想要的内容。有人知道我怎么做吗?

编辑: 这是我的功能之一:

 def PrintCluster(vectorsByKey : Map[Int, List[Double]], vectCentroidPairs : Map[Int, Int]) : Map[Int, List[Double]] = {

    var vectorsByCentroid: Map[Int, List[Double]] = Map()
    val SortedCentroid = vectCentroidPairs.groupBy(_._2).mapValues(x => x.map(_._1).toList).toSeq.sortBy(_._1).toMap 
    SortedCentroid.foreach { case (centroid, vect) => 
      var nbVectors = vect.length

      for (i <- 0 to nbVectors - 1) {
        var vectValues = vectorsByKey(vect(i))
        println(centroid + "  " + vectValues)
        vectorsByCentroid += (centroid -> (vectValues))
      }
    }
    return vectorsByCentroid
  }

我知道这是错的,因为我只会影响一组值的一个唯一键。这就是为什么它只返回Map中每个键的第一个List。我认为使用 saveAsTextFile 函数,我必须使用Map结构,但我真的不知道。

2 个答案:

答案 0 :(得分:1)

根据您的输入数据创建示例rdd

val rdd: RDD[Map[Int, List[List[Double]]]] = spark.sparkContext.parallelize(
  Seq(Map(
    2 -> List(List(-4.4, -2.0, 1.5), List(-3.3, -5.4, 3.9), List(-5.8, -3.3, 2.3), List(-5.2, -4.0, 2.8)),
    1 -> List(List(7.3, 1.0, -2.0), List(9.8, 0.4, -1.0), List(7.5, 0.3, -3.0), List(6.1, -0.5, -0.6), List(7.8, 2.2, -0.7), List(6.6, 1.4, -1.1), List(8.1, -0.0, 2.7)),
    3 -> List(List(-3.0, 4.0, 1.4), List(-4.0, 3.9, 0.8), List(-1.4, 4.3, -0.5), List(-1.6, 5.2, 1.0)))
  )
)

RDD[Map[Int, List[List[Double]]]]转换为RDD[(Int, String)]

val result: RDD[(Int, String)] = rdd.flatMap(i => {
  i.map {
    case (x, y) => y.map(list => (x, list.mkString(" ")))
  }
}).flatMap(z => z)

result.foreach(println)

result.saveAsTextFile("location")

答案 1 :(得分:0)

使用Map[Int, List[List[Double]]]并简单地以所需格式打印它很简单,可以先转换为列表然后应用flatMap来完成。使用评论中提供的数据:

val map: Map[Int, List[List[Double]]] = Map(
  2 -> List(List(-4.4, -2.0, 1.5), List(-3.3, -5.4, 3.9), List(-5.8, -3.3, 2.3), List(-5.2, -4.0, 2.8)), 
  1 -> List(List(7.3, 1.0, -2.0), List(9.8, 0.4, -1.0), List(7.5, 0.3, -3.0), List(6.1, -0.5, -0.6), List(7.8, 2.2, -0.7), List(6.6, 1.4, -1.1), List(8.1, -0.0, 2.7)), 
  3 -> List(List(-3.0, 4.0, 1.4), List(-4.0, 3.9, 0.8), List(-1.4, 4.3, -0.5), List(-1.6, 5.2, 1.0))
) 

val list = map.toList.flatMap(t => t._2.map((t._1, _)))
val result = for (t <- list) yield t._1 + "\t" + t._2.mkString(",")

// Saving the result to file
import java.io._
val pw = new PrintWriter(new File("fileName.txt"))
result.foreach{ line => pw.println(line)}
pw.close

将打印出来:

2   -4.4,-2.0,1.5
2   -3.3,-5.4,3.9
2   -5.8,-3.3,2.3
2   -5.2,-4.0,2.8
1   7.3,1.0,-2.0
1   9.8,0.4,-1.0
1   7.5,0.3,-3.0
1   6.1,-0.5,-0.6
1   7.8,2.2,-0.7
1   6.6,1.4,-1.1
1   8.1,-0.0,2.7
3   -3.0,4.0,1.4
3   -4.0,3.9,0.8
3   -1.4,4.3,-0.5
3   -1.6,5.2,1.0