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 16:32:58 +08:00 1
看不懂,合并 map 直接相加不就可以了么? map1 ++ map2
|
4
VoidChen OP @zealot0630 合并的过程中 map1 和 map2 有重复的 key,这时候++ 右边的 key-value 会覆盖掉左边的 key-value,所以要写个操作,变成 key -> value1,value2
|
5
VoidChen OP 顶顶= =
|