映射数据集时出现toMap错误

时间:2017-09-20 10:02:12

标签: scala apache-spark rdd

我遇到了错误

 error: Cannot prove that (Int, String, String, String, String, Double, String) <:< (T, U).
           }.collect.toMap

执行具有以下代码段的应用程序时。

val trains = sparkEnvironment.sc.textFile(dataDirectoryPath + "/trains.csv").map { line =>
      val fields = line.split(",")
      // format: (trainID,trainName,departure,arrival,cost,trainClass)
      (fields(0).toInt, fields(1),fields(2),fields(3),fields(4).toDouble,fields(5))
    }.collect.toMap

可能是什么原因,任何人都可以建议一个解决方案?

1 个答案:

答案 0 :(得分:0)

如果您想在toMap上执行Seq,则表示您的序号为Tuple2。 toMap的ScalaDoc声明:

  

除非元素是Tuple2的成员,否则此方法不可用,   每个((T,U))成为地图中的键值对

所以你应该这样做:

val trains = sparkEnvironment.sc.textFile(dataDirectoryPath + "/trains.csv").map { line =>
      val fields = line.split(",")
      // format: (trainID,trainName,departure,arrival,cost,trainClass)
      (fields(0).toInt, // first element of Tuple2 -> "key"
       (fields(1),fields(2),fields(3),fields(4).toDouble,fields(5)) // 2nd element of Tuple2 -> "value"
      )
        }.collect.toMap

这样你的map-statwment会返回RDD[(Int, (String, String, String, String, Double, String))]