嗨,我有以下數據並希望將它映射到第二個參數中的第一項。因此,對於:在映射到列表頭時瞭解Scala映射對象
1 -> List((1,11))
1 -> List((1,1), (1,111))
我想:
(1,11)
(1,1)
當該數據是在RDD我可以做到以下幾點:
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)
然而,當它是一個Map對象(一個GROUPBY的結果)我得到以下幾點:
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)
當我映射到整個列表我得到了我所期望的,但不是當我打電話頭就可以了
scala> m.map(_._2)
res2: scala.collection.immutable.Iterable[List[(Int, Int)]] = List(List((1,11)), List((1,1), (1,111)))
我也能得到我想要的結果,如果我做了以下之一:
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))
請問有人可以解釋一下這裏發生了什麼?
你也可以通過'm.toSeq.map(_._ 2.head)'得到想要的結果 – perreal