V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
VoidChen
V2EX  ›  程序员

学习 spark scala 的一些小细节

  •  
  •   VoidChen · 2018-11-16 14:27:36 +08:00 · 1230 次点击
    这是一个创建于 2224 天前的主题,其中的信息可能已经有所发展或是发生改变。

    常见的两个 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
    })
    

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

    VoidChen
        1
    VoidChen  
    OP
       2018-11-16 14:31:44 +08:00
    前面对 rdd 还做了一些过滤和转化的操作,那个 map 每一个里面只有一对 key-value 的,我只是转成 map 好做分组合并。
    学了快一周的 spark 和 scala 了,因为公司一直还没给我安排任务,我就看代码写写 demo。。。
    感觉 scala 是 java 未来的发展方向啊,spark 以前也没用过,想多认识点小伙伴一起进步 QAQ
    VoidChen
        2
    VoidChen  
    OP
       2018-11-16 14:46:53 +08:00
    有人吗。。。现在都学 python 去了吗。。。
    zealot0630
        3
    zealot0630  
       2018-11-16 16:32:58 +08:00   ❤️ 1
    看不懂,合并 map 直接相加不就可以了么? map1 ++ map2
    VoidChen
        4
    VoidChen  
    OP
       2018-11-16 16:37:37 +08:00
    @zealot0630 合并的过程中 map1 和 map2 有重复的 key,这时候++ 右边的 key-value 会覆盖掉左边的 key-value,所以要写个操作,变成 key -> value1,value2
    VoidChen
        5
    VoidChen  
    OP
       2018-11-16 16:54:17 +08:00
    顶顶= =
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5401 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 08:14 · PVG 16:14 · LAX 00:14 · JFK 03:14
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.