ITEEDU

编程学习网


  • 首页

  • 标签

  • 分类

  • 归档

  • 关于

  • 旧站归档

  • 搜索

Spark操作:Aggregate和AggregateByKey

发表于 2018-09-20 更新于 2019-06-29 分类于 大数据 , spark

Aggregate

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import org.apache.spark.{SparkConf, SparkContext}

object AggregateTest {

def main(args:Array[String]) = {

// 设置运行环境
val conf = new SparkConf().setAppName("Aggregate Test")
val sc = new SparkContext(conf)

var data = List(2,5,8,1,2,6,9,4,3,5)
var res = data.par.aggregate((0,0))(
// seqOp
(acc, number) => (acc._1+number, acc._2+1),
// combOp
(par1, par2) => (par1._1+par2._1, par1._2+par2._2)
)

println(res)

sc.stop
}

}

acc即(0,0),number即data,seqOp将data的值累加到Tuple的第一个元素,将data的个数累加到Tuple的第二个元素。由于没有分区,所以combOp是不起作用的,这个例子里面即使分区了,combOp起作用了,结果也是一样的。

运行结果:

1
(45,10)

AggregateByKey

AggregateByKey和Aggregate差不多,也是聚合,不过它是根据Key的值来聚合。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}

/**
* Created by Administrator on 2017/6/13.
*/
object AggregateByKeyTest {

def main(args:Array[String]) = {

// 设置运行环境
val conf = new SparkConf().setAppName("AggregateByKey Test")
val sc = new SparkContext(conf)

val data = List((1,3),(1,2),(1,4),(2,3),(3,6),(3,8))
val rdd = sc.parallelize(data)

val res : RDD[(Int,Int)] = rdd.aggregateByKey(0)(
// seqOp
math.max(_,_),
// combOp
_+_
)

res.collect.foreach(println)
sc.stop
}

}

根据Key值的不同,可以分为3个组:

(1) (1,3),(1,2),(1,4);
(2) (2,3);
(3) (3,6),(3,8)。

这3个组分别进行seqOp,也就是(K,V)里面的V和0进行math.max()运算,运算结果和下一个V继续运算,以第一个组为例,运算过程是这样的:

0, 3 => 3
3, 2 => 3
3, 4 => 4

所以最终结果是(1,4)。combOp是对把各分区的V加起来,由于这里并没有分区,所以实际上是不起作用的。

运行结果:

1
2
3
(2,3)
(1,4)
(3,8)

如果生成RDD时分成3个区:

1
val rdd = sc.parallelize(data,3)

运行结果就变成了:

1
2
3
(3,8)
(1,7)
(2,3)

这是因为一个分区返回(1,3),另一个分区返回(1,4),combOp将这两个V加起来,就得到了(1,7)。

证心 微信支付

微信支付

# 大数据 # spark
Spark中map和flatMap的区别详解
IPFS 入门笔记
  • 文章目录
  • 站点概览

证心

367 日志
45 分类
78 标签
GitHub 微博
  1. 1. Aggregate
  2. 2. AggregateByKey
京ICP备16069454号 © 2020 证心