spark aggregate源代码

  /**
* Aggregate the elements of each partition, and then the results for all the partitions, using
* given combine functions and a neutral "zero value". This function can return a different result
* type, U, than the type of this RDD, T. Thus, we need one operation for merging a T into an U
* and one operation for merging two U's, as in scala.TraversableOnce. Both of these functions are
* allowed to modify and return their first argument instead of creating a new U to avoid memory
* allocation.
*/
def aggregate[U](zeroValue: U)(seqOp: JFunction2[U, T, U],
combOp: JFunction2[U, U, U]): U =
rdd.aggregate(zeroValue)(seqOp, combOp)(fakeClassTag[U])

aggregate用于聚合RDD中的元素,先使用seqOp将RDD中每个分区中的T类型元素聚合成U类型,
再使用combOp将之前每个分区聚合后的U类型聚合成U类型,注意seqOp和combOp都会使用zeroValue的值,zeroValue的类型为U。


样例代码:

需要注意的是:

单分区和多分区是不一样的。

        List<Integer> list = new ArrayList<>();
list.add(2);
list.add(3);
list.add(2);
list.add(5);
list.add(2);
list.add(6); //单分区情况下
JavaRDD<Integer> rdd1 = sc.parallelize(list,1);
System.out.println("NumPartitions :"+rdd1.getNumPartitions()); int result1 = rdd1.aggregate(1, new Function2<Integer, Integer, Integer>() {
@Override
public Integer call(Integer v1, Integer v2) throws Exception {
return v1 * v2;//等同于zeroValue*2得到的值再*3...同理得到的值再*2*5*2*6等于720
}
}, new Function2<Integer, Integer, Integer>() {
@Override
public Integer call(Integer v1, Integer v2) throws Exception {
return v1 + v2;//等同于zeroValue+前面函数得到的值,也就是1+720=721
}
});
System.out.println("result1: "+result1); //多分区情况下
JavaRDD<Integer> rdd2 = sc.parallelize(list,2);
System.out.println("NumPartitions :"+rdd2.getNumPartitions());
JavaRDD<String> mapPartitionsWithIndex = rdd2.mapPartitionsWithIndex(new Function2<Integer, Iterator<Integer>, Iterator<String>>() {
@Override
public Iterator<String> call(Integer part_id, Iterator<Integer> iterator) throws Exception {
List<String> list = new ArrayList<>();
while (iterator.hasNext()) {
list.add("partition" + part_id + ":" + iterator.next());
}
return list.iterator();
}
}, true);
mapPartitionsWithIndex.foreachPartition((VoidFunction<Iterator<String>>) iterator -> {
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
});
//输出结果:
// partition0:2
// partition0:3
// partition0:2
// partition1:5
// partition1:2
// partition1:6 int result2 = rdd2.aggregate(2, new Function2<Integer, Integer, Integer>() {
@Override
public Integer call(Integer v1, Integer v2) throws Exception {
return v1 * v2;
//这次修改zeroValue为2
//partition0中的元素有2,3,2 计算结果是2*2*3*2=24 其中2指zeroValue
//partition0中的元素有5,2,6 计算结果是2*5*2*6=120 其中2指zeroValue
}
}, new Function2<Integer, Integer, Integer>() {
@Override
public Integer call(Integer v1, Integer v2) throws Exception {
return v1 + v2;
//计算结果2+24+120=146,其中2指zeroValue
}
});
System.out.println("result2: "+result2);

spark aggregate算子的更多相关文章

  1. Spark RDD概念学习系列之Spark的算子的分类(十一)

    Spark的算子的分类 从大方向来说,Spark 算子大致可以分为以下两类: 1)Transformation 变换/转换算子:这种变换并不触发提交作业,完成作业中间过程处理. Transformat ...

  2. Spark常用算子-KeyValue数据类型的算子

    package com.test; import java.util.ArrayList; import java.util.List; import java.util.Map; import or ...

  3. Spark RDD概念学习系列之Spark的算子的作用(十四)

    Spark的算子的作用 首先,关于spark算子的分类,详细见 http://www.cnblogs.com/zlslch/p/5723857.html 1.Transformation 变换/转换算 ...

  4. Spark操作算子本质-RDD的容错

    Spark操作算子本质-RDD的容错spark模式1.standalone master 资源调度 worker2.yarn resourcemanager 资源调度 nodemanager在一个集群 ...

  5. Spark RDD算子介绍

    Spark学习笔记总结 01. Spark基础 1. 介绍 Spark可以用于批处理.交互式查询(Spark SQL).实时流处理(Spark Streaming).机器学习(Spark MLlib) ...

  6. 列举spark所有算子

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

  7. java实现spark常用算子之groupbykey

    import org.apache.spark.SparkConf;import org.apache.spark.api.java.JavaPairRDD;import org.apache.spa ...

  8. [大数据之Spark]——Actions算子操作入门实例

    Actions reduce(func) Aggregate the elements of the dataset using a function func (which takes two ar ...

  9. spark aggregate函数详解

    aggregate算是spark中比较常用的一个函数,理解起来会比较费劲一些,现在通过几个详细的例子带大家来着重理解一下aggregate的用法. 1.先看看aggregate的函数签名在spark的 ...

随机推荐

  1. 吴裕雄 Bootstrap 前端框架开发——Bootstrap 排版:引导主体副本

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  2. Elasticsearch 如何使用RESTful API

    所有其他语言可以使用 RESTful API 通过端口 9200 和 Elasticsearch 进行通信,你可以用你最喜爱的 web 客户端访问 Elasticsearch .事实上,正如你所看到的 ...

  3. Redis实战(20)Redis 如何从海量数据中查询出某一个 Key?

    序言 资料 https://www.cnblogs.com/vipstone/p/12373734.html

  4. java 8时间使用LocalDateTime,ZonedDateTime,LocalDate

    前言 java 8的时间已经能够满足日常的使用,也方便理解.joda-time作为一个有优秀的时间组件也不得不告知使用者在java 8以后使用自带的时间 LocalDateTime以及ZonedDat ...

  5. Git远程分支代码强制回退&Tag添加

    Git指令大全:https://www.alexkras.com/getting-started-with-git/ Git提交错了,还是Master分支,哎呦喂咋整?请见下文.   [场景描述] 项 ...

  6. text-align:center;在ie7下,父级加上会让block状态的子元素居中。

    text-align:center:在ie7下,父级加上会让block状态的子元素居中.ie8以上不会.

  7. 46 求1+2+3+...+n 静态成员函数和静态变量

    题目描述 求1+2+3+...+n,要求不能使用乘除法.for.while.if.else.switch.case等关键字及条件判断语句(A?B:C). 思路: 1)使用构造函数的方法,需要使用sta ...

  8. C++11并发编程3------线程传参

    /* 基本类型传值 */ #include <iostream> #include <thread> void func(int num) { num = ; std::cou ...

  9. div背景图片自适应

    对背景图片设置属性:background-size:cover;可以实现背景图片适应div的大小. background-size有3个属性: auto:当使用该属性的时候,背景图片将保持100% 的 ...

  10. .NET List<T>Conat vs AddRange

    最大的不同在于AddRange改变了它所调用的列表,而Concat创建了一个新的List.因此它们有不同的用途. Concat也是一种适用于任何IEnumerable的扩展方法,并返回一个IEnume ...