Salut J'ai les données suivantes et je veux le mapper au premier élément du second paramètre. Donc, pour:Comprendre l'objet Scala Map lors du mappage vers la tête d'une liste
1 -> List((1,11))
1 -> List((1,1), (1,111))
Je veux:
(1,11)
(1,1)
Lorsque ces données sont dans un RDD je peux faire ce qui suit:
scala> val m = sc.parallelize(Seq(11 -> List((1,11)), 1 -> List((1,1),(1,111))))
m: org.apache.spark.rdd.RDD[(Int, List[(Int, Int)])] = ParallelCollectionRDD[198] at parallelize at <console>:47
scala> m.map(_._2.head).collect.foreach(println)
(1,11)
(1,1)
Cependant, quand il est dans un objet de la carte (résultat d'un groupePar) Je reçois ce qui suit:
scala> val m = Map(11 -> List((1,11)), 1 -> List((1,1)))
m: scala.collection.immutable.Map[Int,List[(Int, Int)]] = Map(11 -> List((1,11)), 1 -> List((1,1), (1,111)))
scala> m.map(_._2.head)
res1: scala.collection.immutable.Map[Int,Int] = Map(1 -> 1)
Quand je associez à toute la liste-je obtenir ce que j'attendais, mais pas quand je l'appelle tête il
scala> m.map(_._2)
res2: scala.collection.immutable.Iterable[List[(Int, Int)]] = List(List((1,11)), List((1,1), (1,111)))
Je peux aussi obtenir le résultat que je veux si je fais une des opérations suivantes:
scala> m.map(_._2).map(_.head)
res4: scala.collection.immutable.Iterable[(Int, Int)] = List((1,11), (1,1))
scala> m.values.map(_.head)
res5: Iterable[(Int, Int)] = List((1,11), (1,1))
Quelqu'un pourrait expliquer s'il vous plaît ce qui se passe ici?
vous pouvez également faire 'm.toSeq.map (_._ 2.head)' pour obtenir le résultat désiré – perreal