aggregateByKey 这个RDD有点繁琐,整理一下使用示例,供参考

直接上代码

import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkContext, SparkConf} /**
* Created by Edward on 2016/10/27.
*/
object AggregateByKey {
def main(args: Array[String]) {
val sparkConf: SparkConf = new SparkConf().setAppName("AggregateByKey")
.setMaster("local")
val sc: SparkContext = new SparkContext(sparkConf) val data = List((1, 3), (1, 2), (1, 4), (2, 3))
var rdd = sc.parallelize(data,2)//数据拆分成两个分区 //合并在不同partition中的值,a,b的数据类型为zeroValue的数据类型
def comb(a: String, b: String): String = {
println("comb: " + a + "\t " + b)
a + b
}
//合并在同一个partition中的值, a的数据类型为zeroValue的数据类型,b的数据类型为原value的数据类型
def seq(a: String, b: Int): String = {
println("seq: " + a + "\t " + b)
a + b
} rdd.foreach(println)

//zeroValue 中立值,定义返回value的类型,并参与运算
//seqOp 用来在一个partition中合并值的
//comb 用来在不同partition中合并值的
val aggregateByKeyRDD: RDD[(Int, String)] = rdd.aggregateByKey("100")(seq,comb) //打印输出
aggregateByKeyRDD.foreach(println) sc.stop()
}
}

输出结果说明:

 /*
将数据拆分成两个分区 //分区一数据
(1,3)
(1,2)
//分区二数据
(1,4)
(2,3) //分区一相同key的数据进行合并
seq: 100 3 //(1,3)开始和中立值进行合并 合并结果为 1003
seq: 1003 2 //(1,2)再次合并 结果为 10032 //分区二相同key的数据进行合并
seq: 100 4 //(1,4) 开始和中立值进行合并 1004
seq: 100 3 //(2,3) 开始和中立值进行合并 1003 将两个分区的结果进行合并
//key为2的,只在一个分区存在,不需要合并 (2,1003)
(2,1003) //key为1的, 在两个分区存在,并且数据类型一致,合并
comb: 10032 1004
(1,100321004) * */

参考代码及下面的说明进行理解

官网的说明

aggregateByKey(zeroValue)(seqOpcombOp, [numTasks]) When called on a dataset of (K, V) pairs, returns a dataset of (K, U) pairs where the values for each key are aggregated using the given combine functions and a neutral "zero" value. Allows an aggregated value type that is different than the input value type, while avoiding unnecessary allocations. Like in groupByKey, the number of reduce tasks is configurable through an optional second argument.

源码中函数的说明

/**
* Aggregate the values of each key, using given combine functions and a neutral "zero value".
* This function can return a different result type, U, than the type of the values in this RDD,
* V. Thus, we need one operation for merging a V into a U and one operation for merging two U's,
* as in scala.TraversableOnce. The former operation is used for merging values within a
* partition, and the latter is used for merging values between partitions. To avoid memory
* allocation, both of these functions are allowed to modify and return their first argument
* instead of creating a new U.
*/

Spark RDD aggregateByKey的更多相关文章

  1. Spark RDD 操作

    1. Spark RDD 创建操作 1.1 数据集合   parallelize 可以创建一个能够并行操作的RDD.其函数定义如下: ) scala> sc.defaultParallelism ...

  2. Spark RDD Transformation 简单用例(二)

    aggregateByKey(zeroValue)(seqOp, combOp, [numTasks]) aggregateByKey(zeroValue)(seqOp, combOp, [numTa ...

  3. Spark RDD Transformation 简单用例(一)

    map(func) /** * Return a new RDD by applying a function to all elements of this RDD. */ def map[U: C ...

  4. spark RDD官网RDD编程指南

    http://spark.apache.org/docs/latest/rdd-programming-guide.html#using-the-shell Overview(概述) 在较高的层次上, ...

  5. spark学习13(spark RDD)

    RDD及其特点 1)RDD(Resillient Distributed Dataset)弹性分布式数据集,是spark提供的核心抽象.它代表一个不可变.可分区.里面的元素可并行计算的集合 2)RDD ...

  6. Spark RDD :Spark API--Spark RDD

    一.RDD的概述 1.1 什么是RDD? RDD(Resilient Distributed Dataset)叫做弹性分布式数据集,是Spark中最基本的数据抽象,它代表一个不可变.可分区.里面的元素 ...

  7. Spark RDD 算子总结

    Spark算子总结 算子分类 Transformation(转换) 转换算子 含义 map(func) 返回一个新的RDD,该RDD由每一个输入元素经过func函数转换后组成 filter(func) ...

  8. Spark—RDD编程常用转换算子代码实例

    Spark-RDD编程常用转换算子代码实例 Spark rdd 常用 Transformation 实例: 1.def map[U: ClassTag](f: T => U): RDD[U]  ...

  9. Spark Rdd coalesce()方法和repartition()方法

    在Spark的Rdd中,Rdd是分区的. 有时候需要重新设置Rdd的分区数量,比如Rdd的分区中,Rdd分区比较多,但是每个Rdd的数据量比较小,需要设置一个比较合理的分区.或者需要把Rdd的分区数量 ...

随机推荐

  1. 正则表达式regex狂记

    正则.正则..往往在某个不经意间显示其强大的潜能 概念等基础知识不做介绍,直奔规则.格式.实例…… 元字符 描述 \ 将下一个字符标记为一个特殊字符.或一个原义字符.或一个向后引用.或一个八进制转义符 ...

  2. css狂记

    接着上一篇 html狂记,同样是DIV+CSS传统站点开发,同样只是收集.整理... CSS 背景属性(Background) 属性 描述 CSS background 在一个声明中设置所有的背景属性 ...

  3. 小小收获for python

    包导入问题: 包之外导入:还是按照sys.path的搜索路径进行模块的导入 包内的导入:python3.0+     完全区分绝对导入和相对导入 from . import string     #在 ...

  4. java 接口中模拟浏览器 请求webservice 接受返回数据

    使用HttpClient 所需jar:commons-codec-1.9.jar,commons-httpclient-3.1.jar try { HttpClient client = new Ht ...

  5. CodeSmith7代码生成器针对PostgreSQL数据库无法使用的Bug修复全过程

    前言 最近公司需要将原来使用的MSSQL数据库整体迁移至pgsql,需要使用CodeSmith生成IBatisNet的配置文件.按照提示安装了Npgsql.dll后依然无法使用.引发了本次通过反编译修 ...

  6. Table of Contents ---BCM

    Table of ContentsAbout This Document................................................................ ...

  7. python基础学习

    1   list ()   定义 2   dict()   转化为字典 3   tuple()  转化为元组 4   sort() 和 sorted()区别 5   a.sort(key=lambda ...

  8. java的继承和重写

    继承是面向对象最显著的一个特性.继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力.[1]  Java继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以 ...

  9. 关于搭建一个高性能网站的服务器的架设思路以及nginx测试的并发

    对于高性能网站的架设,主要就是请求量大,那我们该如何进行支撑? 考虑到下面的几个方面: 1.要减少请求,那对于开发人员来说,网站的css文件进行合并,背景图片也要合并,一般都是请求一张比较大的图片,然 ...

  10. sniffer底层网络配置记录

    公司需要一款可以检查网络的软件,之后任务分配到我们组 经过讨论最终方案是以wireshark为版本,进行二次开发,主要目的在于简化上层操作复杂性(软件使用人群为非专业性的) 软件分为三部分,其一底层网 ...