对spark算子aggregateByKey的理解

对spark算子aggregateByKey的理解

案例

aggregateByKey算子其实相当于是针对不同“key”数据做一个map+reduce规约的操作。

举一个简单的在生产环境中的一段代码
有一些整理好的日志字段,经过处理得到了RDD类型为(String,(String,String))的List格式结果,其中各个String代表的是:(用户名,(访问时间,访问页面url))
同一个用户可能在不同的时间访问了不同或相同的页面,为了合并同一个用户的访问行为,写了下面这段代码,用到aggregateByKey。

val data = sc.parallelize(
List(
("13909029812",("20170507","http://www.baidu.com")),("18089376778",("20170401","http://www.google.com")),("18089376778",("20170508","http://www.taobao.com")),("13909029812",("20170507","http://www.51cto.com"))
)
)
        data.aggregateByKey(scala.collection.mutable.Set[(String, String)](), 200)((set, item) => {
          set += item
        }, (set1, set2) => set1 union set2).mapValues(x => x.toIterable).collect

结果:

res12: Array[(String, Iterable[(String, String)])] = Array((18089376778,Set((20170401,http://www.google.com), (20170508,http://www.taobao.com))), (13909029812,Set((20170507,http://www.51cto.com), (20170507,http://www.baidu.com))))

分解分析:##

aggregateByKey(参数1)(参数2,参数3)

过程:对于data的某个key,参数1为初始化值,在参数2的函数中,初始值和该key的每一个value传入函数进行操作,所有返回的结果在参数3中进行规约。

  • 参数1
  scala.collection.mutable.Set[(String, String)]()

new 了一个空的set集合,做为初始值

  • 参数2
    (set, item) => {
    set += item
    }
    一个类似于map的映射函数,将该key的每一个value(在本案例之是(访问时间,访问url))作为item,将其放入set中并返回。
    可知某个key的所有value都会返回一个含有该value的set

  • 参数3
    (set1, set2) => set1 union set2
    该key的所有value得到的set进行union规约。并返回

最终结果:得到了每一个用户在所有时间的访问url的行为信息。

原文:https://www.jianshu.com/p/09912beb1350

 

使用Spark算子aggregateByKey举例,可以参考以下代码: ```scala import org.apache.spark.{SparkConf, SparkContext} object Demo { def main(args: Array[String]): Unit = { val conf = new SparkConf().setMaster("local").setAppName("aa") val sc = new SparkContext(conf) // 创建一个包含键值对的列表 val list = List((1,2),(2,7),(1,3),(2,8),(3,9),(3,10),(1,4),(1,5),(2,6),(2,11),(3,12),(3,13)) // 将列表转化为RDD val listRDD = sc.parallelize(list,2) // 使用aggregateByKey算子计算每个键对应的最大值 val result = listRDD.aggregateByKey(0)( (a, b) => math.max(a, b), (x, y) => math.max(x, y) ) // 打印结果 result.collect().foreach(println) } } ``` 以上代码中,我们创建了一个包含键值对的列表,然后将其转化为RDD。接下来,使用aggregateByKey算子计算每个键对应的最大值。在seqOp函数中,我们比较当前值与累加器并返回较大的值。在combOp函数中,我们再次比较两个累加器的值并返回较大的值。最后,通过collect函数将结果打印出来。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [详解Spark核心算子 : aggregateByKey和combineByKey](https://blog.csdn.net/f_n_c_k/article/details/88718262)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值