key-value型Rdd转广播变量时注意

当将一个(key,value)Rdd转成广播变量时,需要将该Rdd转成Map类型,但是若一个key对应多个value,直接使用collectAsMap()方法时,key值相同的value会被覆盖,所以不能直接使用collectAsMap()方法。那怎么办了?应该使用collect() + foldLeft()的方式,组成mutable.HashMap对象。collect()Rdd转成ArrayfoldLeft()将相同key值的value组合成一个Array,最后生成一个Map即可。后续方便广播变量使用。


程序测试结果:

key-value型Rdd转广播变量时注意

代码如下:

//collectAsMap将key值相同的value进行覆盖,测试如下:
val data = sc.parallelize(List((1, "www"), (1, "iteblog"), (1, "com"), (2, "bbs"), (2, "iteblog"), (2, "com"), (3, "good")))
println("原始data:")
data.foreach(x => print(x + ";"));println();println()

val data2 = data.collectAsMap
println("collectAsMap后:")
data2.foreach(println(_));println();println()

val data3: Array[(Int, String)] = data.collect()
//把如上的array折叠起来

val data4 = data3.foldLeft(scala.collection.mutable.HashMap[Int, ArrayBuffer[String]]())((curH, item) => {
  if (curH.contains(item._1)) {
    curH(item._1) += (item._2)
    curH
  }
  else {
    curH(item._1) = ArrayBuffer(item._2)
    curH
  }
})
println("foldLeft后:")
data4.foreach(println(_))