spark3总结——分区数对带有初始值聚合操作的影响

简介: spark3总结——分区数对带有初始值聚合操作的影响

主题

在sparkRDD的转换操作中,有几个比较特殊的聚合操作,很容易受到分区数的影响,很容易迷惑初学者,比如fold,aggregate等,他们都有初始值zeroValue,在多分区数据集的情况下,初始值的加入和分区数的变化,会导致不同的计算结果。因为他们在分区内部做一次带有zeroValue的聚合后,在对不同分区聚合结果进行合并的时候,会再做一次带有zeroValue的聚合。我们看如下代码

package com.xhc.sparkscala
import org.apache.spark.{SparkConf, SparkContext}
object AggPartitionTest {
  def main(args: Array[String]): Unit = {
    // spark上下文
    val conf = new SparkConf().setAppName("AggPartitionTest").setMaster("local[*]")
    val sc = SparkContext.getOrCreate(conf)
    // 数据
    val data = Array(1, 2, 3, 4, 5)
    // 不同分区数进行聚合
    for (n <- 1 to 3){
      // 分区数据
      val distData = sc.parallelize(data).repartition(n)
      // 打印分区及分区数据
      distData.mapPartitionsWithIndex((idx, items)=>{items.map(x=>(idx, x))}).foreach(println)
      // 计算
      val foldResult = distData.fold(2)((a, b) => a + b)
      val aggResult = distData.aggregate(2)((a, b) => a + b, (c, d) => c + d)
      // 打印计算结果
      println("分区数:%d,fold结果:%d!".format(n, foldResult))
      println("分区数:%d,agg结果:%d!".format(n, aggResult))
    }
  }
}

运行结果如下:

分区及分区数据:
(0,1)
(0,2)
(0,3)
(0,4)
(0,5)
分区数:1,fold结果:19!
分区数:1,agg结果:19!
分区及分区数据:
(1,3)
(0,1)
(1,4)
(0,2)
(0,5)
分区数:2,fold结果:21!
分区数:2,agg结果:21!
分区及分区数据:
(0,4)
(1,2)
(2,1)
(0,5)
(2,3)
分区数:3,fold结果:23!
分区数:3,agg结果:23!

看到了吧!不同的分区会导致不同聚合结果,我们以fold为例,用图来说明一下上例中的计算过

aggregate计算过程的分析与此类似噢!!

作者这水平有限,有不足之处欢迎留言指正


相关文章
|
1月前
|
SQL 数据采集 分布式计算
Spark SQL中的聚合与窗口函数
Spark SQL中的聚合与窗口函数
|
SQL 分布式计算 Spark
如何在Spark中实现Count Distinct重聚合
Count Distinct是SQL查询中经常使用的聚合统计方式,用于计算非重复结果的数目。由于需要去除重复结果,Count Distinct的计算通常非常耗时。本文主要介绍在Spark中如何基于重聚合实现交互式响应的COUNT DISTINCT支持。
|
SQL JSON 分布式计算
【Spark】(task2)PySpark数据统计和分组聚合
1.2 保存读取的信息 步骤2:将读取的进行保存,表头也需要保存,这里可保存为csv或者json格式文件。
622 0
【Spark】(task2)PySpark数据统计和分组聚合
|
监控 NoSQL 流计算
海量监控日志基于EMR Spark Streaming SQL进行实时聚合
从EMR-3.21.0 版本开始将提供Spark Streaming SQL的预览版功能,支持使用SQL来开发流式分析作业。结果数据可以实时写入Tablestore。 本文以LogHub为数据源,收集ECS上的日志数据,通过Spark Streaming SQL进行聚合后,将流计算结果数据实时写入Tablestore,展示一个简单的日志监控场景。
5741 0
|
分布式计算 监控 NoSQL
海量监控日志基于EMR Spark Streaming SQL进行实时聚合
从EMR-3.21.0 版本开始将提供Spark Streaming SQL的预览版功能,支持使用SQL来开发流式分析作业。结果数据可以实时写入Tablestore。 本文以LogHub为数据源,收集ECS上的日志数据,通过Spark Streaming SQL进行聚合后,将流计算结果数据实时写入Tablestore,展示一个简单的日志监控场景。
|
1月前
|
分布式计算 Hadoop 大数据
大数据技术与Python:结合Spark和Hadoop进行分布式计算
【4月更文挑战第12天】本文介绍了大数据技术及其4V特性,阐述了Hadoop和Spark在大数据处理中的作用。Hadoop提供分布式文件系统和MapReduce,Spark则为内存计算提供快速处理能力。通过Python结合Spark和Hadoop,可在分布式环境中进行数据处理和分析。文章详细讲解了如何配置Python环境、安装Spark和Hadoop,以及使用Python编写和提交代码到集群进行计算。掌握这些技能有助于应对大数据挑战。
|
13天前
|
存储 分布式计算 Hadoop
Spark和Hadoop都是大数据处理领域的重要工具
【6月更文挑战第17天】Spark和Hadoop都是大数据处理领域的重要工具
115 59
|
17天前
|
分布式计算 大数据 数据处理
Apache Spark在大数据处理中的应用
Apache Spark是大数据处理的热门工具,由AMPLab开发并捐赠给Apache软件基金会。它以内存计算和优化的执行引擎著称,提供比Hadoop更快的处理速度,支持批处理、交互式查询、流处理和机器学习。Spark架构包括Driver、Master、Worker Node和Executor,核心组件有RDD、DataFrame、Dataset、Spark SQL、Spark Streaming、MLlib和GraphX。文章通过代码示例展示了Spark在批处理、交互式查询和实时数据处理中的应用,并讨论了其优势(高性能、易用性、通用性和集成性)和挑战。【6月更文挑战第11天】
44 6
|
14天前
|
分布式计算 Hadoop 大数据
大数据技术:Hadoop与Spark的对比
【6月更文挑战第15天】**Hadoop与Spark对比摘要** Hadoop是分布式系统基础架构,擅长处理大规模批处理任务,依赖HDFS和MapReduce,具有高可靠性和生态多样性。Spark是快速数据处理引擎,侧重内存计算,提供多语言接口,支持机器学习和流处理,处理速度远超Hadoop,适合实时分析和交互式查询。两者在资源占用和生态系统上有差异,适用于不同应用场景。选择时需依据具体需求。
|
17天前
|
分布式计算 Kubernetes Spark
大数据之spark on k8s
大数据之spark on k8s