spark-api ByKey三连

combineByKey

  1. combineByKey定义如下图所示combineByKey定义
  2. 举个例子:一组(key,value),统计各个key的平均值;定义中的V默认为(key,value)中的value;实现如下(类型不声明会报错,比较奇怪)在这里插入图片描述

aggregateByKey

  1. aggregateByKey定义如下图所示:比较特殊在这里插入图片描述
  2. aggregateByKey相比于combineByKey,特殊之处是你可以设置默认的初始combiner,不用createCombiner;写法的话,对于上例,把上面的写法开头 x => (x,1) 改成 (0,0) 即可(注意其他部分写法要符合定义的形式);

foldByKey

  1. foldByKey定义如下图所示,更为特殊在这里插入图片描述
  2. foldByKey操作作用于RDD[K,V]根据某个K将其所有V做折叠、合并处理;zeroValue用来初始化 V,然后用于 func (V,V) => V;
  3. 一个很好的例子来自 此处(侵删)
scala> val rdd1 = sc.makeRDD(Array(
     |       ("A", 1), ("A", 2), ("B", 1), ("B", 2), ("C", 1)
     |     ))
rdd1: org.apache.spark.rdd.RDD[(String, Int)] = ParallelCollectionRDD[12] at makeRDD at <console>:24
 
scala> /**
     |       * rdd1中每个key对应的V进行累加,注意zeroValue=0,需要先初始化V,映射函数为+操作
     |       * 比如,("A", 1), ("A", 2),先将zeroValue应用于每个V,得到("A", 1+0), ("A", 2+)|       * 即,("A", 1), ("A", 2),在将映射函数应用于初始化后的V,最后得到("A", 1+@), ("A", 3)
     |       */
     |     rdd1.foldByKey(0)(_+_).collect()
res14: Array[(String, Int)] = Array((B,3), (A,3), (C,1))

# 映射函数为乘法时,zeroValue需设置成1(注意zeroValue是V的初始值V0,会用在第一次见到某个key的value(V1)时,执行func=(_*_) 即V1=V0*V1=1*V1;再见到同一个key的另一个V2,就执行 V2=V1*V2,以此类推;
    rdd1.foldByKey(1)(_*_).collect
 
res16: Array[(String, Int)] = Array((B,2), (A,2), (C,1))

  1. foldByKey应用场景有限
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值