
val map1 = Map("key1" -> 1, "key2" -> 3, "key3" -> 5) val map2 = Map("key2" -> 4, "key3" -> 6, "key5" -> 10) val mapAdd1 = map1 ++ map2.map(t => t._1 -> (t._2 + map1.getOrElse(t._1, 0))) println(mapAdd1) val res = rdd.reduceByKey((x,y) => { val map1 : Map[Long,String] = x val map2 : Map[Long,String] = y //以下常见写法,会遍历一次整个 all ? var all:Map[Long,String] = map2 ++ map1.map(t => { var names = map2.get(t._1) match { //模式匹配选择,map 的 get 方法返回的是 Option 类型 case NOne=> t._2 //当没又这个 key 的时候会返回 None 类型 case Some(s) => t._2 + "," + s //有只的时候会返回 Some 类型 } t._1 -> names }) all }) val res = rdd.reduceByKey((x,y) => { val map1 : Map[Long,String] = x val map2 : Map[Long,String] = y //把数据量少的 map 放前面,追加的 map 放后面,下面叠加的时候就能少操作一些 var all:Map[Long,String] = map2 ++ map1 //因为 ++ 符号右覆盖左 //循环新加入的 map(ps:这里实际只有一个) map2.keys.foreach(k =>{ var names = map1.get(k) match { //模式匹配选择,map 的 get 方法返回的是 Option 类型 case NOne=> map2(k) //当没又这个 key 的时候会返回 None 类型 case Some(s) => map2(k) + "," + s //有只的时候会返回 Some 类型 } all += (k -> names) }) all }) 1 VoidChen OP 前面对 rdd 还做了一些过滤和转化的操作,那个 map 每一个里面只有一对 key-value 的,我只是转成 map 好做分组合并。 学了快一周的 spark 和 scala 了,因为公司一直还没给我安排任务,我就看代码写写 demo。。。 感觉 scala 是 java 未来的发展方向啊,spark 以前也没用过,想多认识点小伙伴一起进步 QAQ |
2 VoidChen OP 有人吗。。。现在都学 python 去了吗。。。 |
3 zealot0630 2018 年 11 月 16 日 看不懂,合并 map 直接相加不就可以了么? map1 ++ map2 |
4 VoidChen OP @zealot0630 合并的过程中 map1 和 map2 有重复的 key,这时候++ 右边的 key-value 会覆盖掉左边的 key-value,所以要写个操作,变成 key -> value1,value2 |
5 VoidChen OP 顶顶= = |