zoukankan      html  css  js  c++  java
  • 关于spark当中的reducebykey 和groupbykey两者的区别

    reducebykey:它的特点是当使用它的时候,这个时候在不同的partition 中的数据会进行简单的combiner。然后再在reduce端进行数据的累加。

    groupbykey:当采用它的时候。这个时候他不是对不同的partition中的数据进行combiner。而是直接在最后进行数据的累加。做最后的reduce。
      

    注:借用别人的一段代码:

    val words = Array("one", "two", "two", "three", "three", "three")  

    //下面的代码是对数组中的数据进行简单的转化。把数据转化成pairRDD的形式。

    val wordPairsRDD = sc.parallelize(words).map(word => (word, 1))  

    //下面是进行reducebykey的操作。直接对key相同的进行相加。

    val wordCountsWithReduce = wordPairsRDD.reduceByKey(_ + _)  

    // 下面的操作是对数据进行相加。但是他的操作是分两部分进行操作的。第一步是进行分组。第二步才是进行累加。

    val wordCountsWithGroup = wordPairsRDD.groupByKey().map(t => (t._1, t._2.sum)) 

    我在idea里面对这两个效果进行编辑,结果如下:

    从这张图当中我们可以看到最终的RDD操作是键对应值的这样的累加形式。直接对相同的key进行累加。

    上面这张图是对groupbykey的操作。从中我们可以看出他其实是对pairRDD的一个简单的迭代运算。就像上面所说的他实际在各个partition当中是不会进行

     数据的简单的combiner的。而只是一个简单的迭代运算。后面如果还需要进行相同key的一个累加还要做相对应的操作才能完成。

    从图中的打印结果我们能够清楚的看出。两者的区别在哪里。

    注:在spark2当中使用sparkssion代替了sparkcontext。最后变成了spark。然后将spark转化为sparkcontext。然后将数组当中的数据转化成RDD进行操作。

     

  • 相关阅读:
    habse与Hadoop兼容性问题
    java读取TXT文件(硬核区分编码格式)
    ffmpeg相关用法
    java服务器间http通讯,同时传输文件流和数据,并接收返回的文件流或数据
    js 获取正整数各个位上的数字
    解决Input输入中文重复出现拼音
    为什么 io 包一般以 byte 数组做为处理单位?
    Vue3 + Ts 封装axios
    Vue3 ant design 使用Moment.js日期格式化的实现
    Vue3 NProgress进度条
  • 原文地址:https://www.cnblogs.com/gxgd/p/8862545.html
Copyright © 2011-2022 走看看