key-value型Rdd转广播变量时注意
当将一个(key,value)型Rdd转成广播变量时,需要将该Rdd转成Map类型,但是若一个key对应多个value,直接使用collectAsMap()方法时,key值相同的value会被覆盖,所以不能直接使用collectAsMap()方法。那怎么办了?应该使用collect() + foldLeft()的方式,组成mutable.HashMap对象。collect()将Rdd转成Array,foldLeft()将相同key值的value组合成一个Array,最后生成一个Map即可。后续方便广播变量使用。
程序测试结果:
代码如下:
//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(_))