学习 spark scala 的一些小细节

2018-11-16 14:27:36 +08:00
 VoidChen

常见的两个 map 合并操作 demo

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)

于是我就根据这个写了以下 demo (部分)

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
})

然后查资料发现 reduceByKey 这个转换,实际上是逐个读取 rdd 里面的数据,把 data1 和 data2 f(x)之后的结果,继续和 data3 进行 f(x),如此一直迭代下去。不知道我说的对不对,如果理解有误,麻烦指正下

所以我又有了以下改进

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
})

不知道我这做法对不对。。。是不是能减少遍历?

1221 次点击
所在节点    程序员
5 条回复
VoidChen
2018-11-16 14:31:44 +08:00
前面对 rdd 还做了一些过滤和转化的操作,那个 map 每一个里面只有一对 key-value 的,我只是转成 map 好做分组合并。
学了快一周的 spark 和 scala 了,因为公司一直还没给我安排任务,我就看代码写写 demo。。。
感觉 scala 是 java 未来的发展方向啊,spark 以前也没用过,想多认识点小伙伴一起进步 QAQ
VoidChen
2018-11-16 14:46:53 +08:00
有人吗。。。现在都学 python 去了吗。。。
zealot0630
2018-11-16 16:32:58 +08:00
看不懂,合并 map 直接相加不就可以了么? map1 ++ map2
VoidChen
2018-11-16 16:37:37 +08:00
@zealot0630 合并的过程中 map1 和 map2 有重复的 key,这时候++ 右边的 key-value 会覆盖掉左边的 key-value,所以要写个操作,变成 key -> value1,value2
VoidChen
2018-11-16 16:54:17 +08:00
顶顶= =

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/508511

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX