Spark算子

Posted 康威特冶楼

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spark算子相关的知识,希望对你有一定的参考价值。


释义

根据RDD中的某个属性进行分组,分组后形式为(k, [(k, v1), (k, v2), ...]),即groupBy 后组内元素会保留key值
方法签名如下:

def groupBy[K](f: T => K)(implicit kt: ClassTag[K]): RDD[(K, Iterable[T])] = withScope {
   ...
}

f: 分组操作。输入类型为T,操作过程为K,最后RDD形式为K, 迭代器(T)的形式,即同上所述形式

案例

查看每个科目有哪些学生选择

object TestGroupBy {
  def main(args: Array[String]): Unit = {
    val conf: SparkConf = new SparkConf().setAppName("TestReduceByKey").setMaster("local[1]")
    val sc: SparkContext = new SparkContext(conf)
    val data = Array(("Science", "Jack"), ("Science", "Tom"), ("Music", "Nancy"), ("Sport", "Tom"), ("Music", "Tony"))
    val result: Array[(String, Iterable[(String, String)])] = sc.parallelize(data)
      .groupBy(v => v._1)
      .collect()
    result.foreach(println)
  }
}

输出

(Music,CompactBuffer((Music,Nancy), (Music,Tony)))
(Science,CompactBuffer((Science,Jack), (Science,Tom)))
(Sport,CompactBuffer((Sport,Tom)))

解释

  1. 根据v._1即名字进行分组,分组后key为名字,value为CompactBuffer
  • 这是Spark定义的结构(源码),类似于Scala原生的ArrayBuffer,但比后者性能更好
  • CompactBuffer 继承自序列,因此它很容易的进行遍历和迭代,可以把它理解成一个列表
  1. 分组后,CompactBuffer 中的值会保留调用groupBy时的RDD格式



以上是关于Spark算子的主要内容,如果未能解决你的问题,请参考以下文章

Spark算子篇 --Spark算子之combineByKey详解

spark的做算子统计的Java代码(在Linux系统集群式运行)

大数据-spark理论算子,shuffle优化

Spark中的各种action算子操作(java版)

UserView--第二种方式(避免第一种方式Set饱和),基于Spark算子的java代码实现

spark中如何测量每个算子的运行时间