在Spark中,聚合算子是非常常用的操作,它们可以对数据进行分组,并根据一定的规则进行聚合计算。本文将介绍Spark中常用的聚合算子,并给出示例代码。

1. groupByKey

groupByKey是基于键值对的RDD,根据键将数据进行分组。它将同一键的所有值放在一个迭代器中,返回一个键值对的RDD。使用groupByKey可以方便地对数据进行分组统计。

示例代码:

val rdd = sc.parallelize(List(("apple", 2), ("banana", 3), ("apple", 5), ("banana", 4)))

val result = rdd.groupByKey().mapValues(_.toList)

result.collect.foreach(println)

输出结果:

(apple, List(2, 5))

(banana, List(3, 4))

2. reduceByKey

reduceByKey是基于键值对的RDD,对每个键对应的值进行规约操作,最终输出每个键对应的一个值。它将相同键的值进行合并,并将合并结果应用于下一个值,最终输出每个键对应的最终结果。

示例代码:

val rdd = sc.parallelize(List(("apple", 2), ("banana", 3), ("apple", 5), ("banana", 4)))

val result = rdd.reduceByKey(_ + _)

result.collect.foreach(println)

输出结果:

(apple, 7)

(banana, 7)

3. aggregateByKey

aggregateByKey是基于键值对的RDD,对每个键对应的值进行聚合操作。它使用一个初始值,将每个分区内相同键的值进行聚合,然后再将各个分区的结果进行合并得到最终结果。

示例代码:

val rdd = sc.parallelize(List(("apple", 2), ("banana", 3), ("apple", 5), ("banana", 4)))

val result = rdd.aggregateByKey(0)(_ + _, _ + _)

result.collect.foreach(println)

输出结果:

(apple, 7)

(banana, 7)

4. foldByKey

foldByKey是基于键值对的RDD,对每个键对应的值进行折叠操作。与reduceByKey类似,它使用一个初始值,并将每个分区内相同键的值进行折叠,然后再将各个分区的结果进行合并得到最终结果。

示例代码:

val rdd = sc.parallelize(List(("apple", 2), ("banana", 3), ("apple", 5), ("banana", 4)))

val result = rdd.foldByKey(0)(_ + _)

result.collect.foreach(println)

输出结果:

(apple, 7)

(banana, 7)

5. combineByKey

combineByKey是基于键值对的RDD,对每个键对应的值进行组合操作。它使用一个初始值和三个函数:将值转换为累加器类型的函数,将两个累加器合并的函数,以及将多个分区的累加器合并的函数。

示例代码:

val rdd = sc.parallelize(List(("apple", 2), ("banana", 3), ("apple", 5), ("banana", 4)))

val result = rdd.combineByKey(

(v: Int) => (v, 1),

(acc: (Int, Int), v: Int) => (acc._1 + v, acc._2 + 1),

(acc1: (Int, Int), acc2: (Int, Int)) => (acc1._1 + acc2._1, acc1._2 + acc2._2)

)

result.collect.foreach(println)

输出结果:

(apple, (7, 2))

(banana, (7, 2))

以上是Spark中常用的聚合算子的说明及使用示例。它们可以帮助我们对数据进行聚合计算,方便地进行数据统计和分析。在实际工作中,根据具体的需求选择合适的聚合算子,并结合其他操作,可以进行更加灵活和高效的数据处理。

参考链接:

Spark Programming Guide - Aggregations

本文来自极简博客,作者:倾城之泪,转载请注明原文链接:Spark中常用的聚合算子说明及使用