Spark核心RDD:combineByKey函数详解

Sprak combineByKey详解 1、背景 在数据分析中,处理Key,Value的Pair数据是极为常见的场景,例如我们可以针对这样的数据进行分组、聚合或者将两个包含Pair数据的RDD根据key进行join。从函数的抽象层面看,这些操作具有共同的特征,都是将类型为RDD[(K,V)]的数据处理为RDD[(K,C)]。这里的V和C可以是相同类型,也可以是不同类型。这种数据处理操作并非单纯的对Pair的value进行map,而是针对不同的key值对原有的value进行联合(Combine)。因而,不仅类型可能不同,元素个数也可能不同。 com 阅读详情

为什么单独讲解combineByKey?

因为combineByKey是Spark中一个比较核心的高级函数,其他一些高阶键值对函数底层都是用它实现的。诸如 groupByKey,reduceByKey等等

如下给出combineByKey的定义,其他的细节暂时忽略(1.6.0版的函数名更新为combineByKeyWithClassTag)

[java]  view plain  copy
  1. def combineByKey[C](  
  2.       createCombiner: V => C,  
  3.       mergeValue: (C, V) => C,  
  4.       mergeCombiners: (C, C) => C,  
  5.       partitioner: Partitioner,  
  6.       mapSideCombine: Boolean = true,  
  7.       serializer: Serializer = null)  
如下解释下3个重要的函数参数:
  • createCombiner: V => C ,这个函数把当前的值作为参数,此时我们可以对其做些附加操作(类型转换)并把它返回 (这一步类似于初始化操作)
  • mergeValue: (C, V) => C,该函数把元素V合并到之前的元素C(createCombiner)上 (这个操作在每个分区内进行)
  • mergeCombiners: (C, C) => C,该函数把2个元素C合并 (这个操作在不同分区间进行)

如下看一个使用combineByKey来求解平均数的例子
[java]  view plain  copy
  1. val initialScores = Array(("Fred", 88.0), ("Fred", 95.0), ("Fred", 91.0), ("Wilma", 93.0), ("Wilma", 95.0), ("Wilma", 98.0))  
  2. val d1 = sc.parallelize(initialScores)  
  3. type MVType = (Int, Double) //定义一个元组类型(科目计数器,分数)  
  4. d1.combineByKey(  
  5.   score => (1, score),  
  6.   (c1: MVType, newScore) => (c1._1 + 1, c1._2 + newScore),  
  7.   (c1: MVType, c2: MVType) => (c1._1 + c2._1, c1._2 + c2._2)  
  8. ).map { case (name, (num, socre)) => (name, socre / num) }.collect  
参数含义的解释
a 、score => (1, score),我们把分数作为参数,并返回了附加的元组类型。 以"Fred"为列,当前其分数为88.0 =>(1,88.0)  1表示当前科目的计数器,此时只有一个科目

b、(c1: MVType, newScore) => (c1._1 + 1, c1._2 + newScore),注意这里的c1就是createCombiner初始化得到的(1,88.0)。在一个分区内,我们又碰到了"Fred"的一个新的分数91.0。当然我们要把之前的科目分数和当前的分数加起来即c1._2 + newScore,然后把科目计算器加1即c1._1 + 1

c、 (c1: MVType, c2: MVType) => (c1._1 + c2._1, c1._2 + c2._2),注意"Fred"可能是个学霸,他选修的科目可能过多而分散在不同的分区中。所有的分区都进行mergeValue后,接下来就是对分区间进行合并了,分区间科目数和科目数相加分数和分数相加就得到了总分和总科目数

执行结果如下:
[plain]  view plain  copy
  1. res1: Array[(String, Double)] = Array((Wilma,95.33333333333333), (Fred,91.33333333333333))  


例子来源:http://codingjunkie.net/spark-combine-by-key/
Spark(五) 5.2 双Value类型 5.2.1 union 作用:对源 RDD 和参数 RDD 求并集后返回一个新的 RDD #(1)创建第一个 RDD scala> val rdd1 = sc.parallelize(1 to 5) rdd1: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[23] at parallelize at <console>:24 ​ #(2)创建第二个 RDD scala> val rd 阅读详情

相关推荐

Spark中combineByKey算子详解介绍

前几篇博文我们分别讲解了 `reduceByKey` 、`aggregateByKey` 、`foldByKey` ,本文将讲解一个更为通用的聚合函数 `combineByKey` ,上述几种函数其实底层都是调用了这个函数,该函数更为灵活。

优快云 精品推荐 909

Spark算子: combineByKey 简单解析及案列

简述    我们都晓得,gruopByKey、aggregateByKey、foldByKey…等算子 是用于处理Key,Value的Pair数据,底层都是调用 combineByKeyWithClassTag函数,在日常业务数据处理过程中,如果简单一点的逻辑计算 仅需 使用 Spark 封装好的算子就好了,当涉及到复杂一点的统计规则时, 我们就不得不使用 combineByKey 算子来实现. combineByKey 源码 def combineByKey[C]( //传入 value值 V ,

xinji 2059

STM32duino LSM6DSO驱动库:低功耗IMU工程化实践

惯性测量单元(IMU)是智能终端与工业设备实现运动感知的核心传感器,其性能关键在于数据精度、实时响应与系统功耗的协同优化。LSM6DSO作为集成加速度计与陀螺仪的六轴MEMS器件,依托片上有限状态机(FSM)和机器学习核心(MLC),支持自由落体检测、计步器、6D方向识别等硬件自治功能,显著降低主控CPU负载。在STM32平台下,通过深度耦合HAL/LL库、显式引脚管理、DMA加速SPI传输及EXTI中断协同,可实现亚毫秒级事件响应与微安级待机功耗。本文聚焦STM32duino生态中LSM6DSO驱动的工程

weixin_36304957的博客 552

Spark核心之combineByKey详解

在这里单独讲解combineByKey是因为在练习这个算子是一开始并不是太明白,希望能我的实验过程能帮到其它和我有相同疑惑的人。首先给出combineByKey的定义,其他的细节暂时忽略。 def combineByKey[C]( createCombiner: V => C, mergeValue: (C, V) => C, mergeCom...

LMR的博客 1万+

逆变器并联--下垂控制引入虚拟阻抗

说明传统下垂控制的缺点、分析虚拟阻抗的原理和实现方法

weixin_58670090的博客 1万+

/proc/sys/vm/max_map_count耗尽时,调用glibc 2.11.3 free()导致程序crash,问题追踪和解决

1. 问题 在客户环境下,当我们的程序消耗较大内存时,会偶尔crash。 通过gdb分析,程序core dump在malloc/free函数内。 当把/proc/sys/vm/max_map_count 从65530增加到131070,程序再也不crash。 相关命令 echo 131073 > /proc/sys/vm/max_map_count 2.  core

万大胖博客,苦并快乐着 4430

Spark RDD 的 combineByKey、cogroup 和 compute 算子的作用

是 Spark 调度执行的核心,它定义了如何从存储系统(如 HDFS)中读取数据、如何执行转换算子。是 RDD 中的一个操作,用于将多个 RDD 中具有相同 Key 的值聚合在一起。是 RDD 的核心方法,决定了 RDD 如何计算分区数据。每个具体的 RDD(如。在面试中,结合源码描述其实现原理和常见应用场景,可以有效展示你的深度理解和实践能力。类型的 RDD 按键进行自定义的聚合操作。在面试中如果被问到 Spark RDD 的。的底层实现之一,提供了强大的灵活性。是一个通用的聚合算子,用于对。

z1941563559的博客 1041

基于uniapp实现自定义日历页面、年份月份选择、动态日历渲染、日期标记及备忘录、无组件依赖、多端兼容

基于UniApp框架下自定义日历组件的完整实现方案,涵盖基础日历渲染、年月选择器集成、动态数据标记等核心功能。提供完整代码段,帮助开发者快速构建高性能、高定制化的日历模块,适用于日程管理、预订系统等场景。

商务合作 / 项目定制 / 学习交流。个人vx:lovely_wml 1万+

详解Spark核心算子 : aggregateByKey和combineByKey

详解Spark核心算子 : aggregateByKey和combineByKey aggregateByKey aggregateByKey有三种声明 def aggregateByKey[U: ClassTag](zeroValue: U, partitioner: Partitioner)     (seqOp: (U, V) => U, combOp: (U, U) =&g...

超越时代 2580

Python地理数据处理 十七:植被物候提取和分析(Savitzky-Golay)

植被是陆地生态系统中最重要的组分之一,也是对气候变化最敏感的组分,其在全球变化过程中起着重要作用,能够指示自然环境中的大气、水、土壤等成分的变化,其年际和季节性变化可以作为地球气候变化的重要指标。此外,由于生态工程保护建设和植被自然生长等因素,中国陆地生态系统发挥了重要的碳汇作用。因此,定量评估植被时空动态变化是制定生态系统可持续发展目标和衡量生态系统固碳潜力的重要前提,卫星遥感数据衍生的生态参量产品为研究长时间序列全球及区域植被时空变化提供了重要数据源。SG滤波能够对物候信息进行平滑,并提取其中的物候信息

amyniez的博客,欢迎交流讨论 4248

基于 Google Colab 的 mask rcnn 训练自己的数据集(以实例分割为例)

详细步骤1 数据集的制作1.1 数据标注1.2 生成数据集2 环境的搭建2.1 搭建流程2.2 注意事项(报错)3 开始训练4 可视化4.1 修改webcam.py文件4.2 进行可视化5 参考文章 1 数据集的制作 1.1 数据标注 使用 labelme=4.5.6 版本进行标注,标注文件指定到保存图片的路径下,也就是json文件和jpg文件放在同一个文件夹里 1.2 生成数据集 先手动划分训练集和测试集(包括图像和标注文件),然后分别整合它们的标注信息,参考代码:1_ships_to_coco.py

G果的博客 8002

spark核心RDD-combineByKey方法解析

首先 先来看看官方文档 combineByKey[C](createCombiner: (V) ⇒C,mergeValue: (C,V) ⇒C,mergeCombiners: (C,C) ⇒C,numPartitions:Int):RDD[(K,C)] 简单的解释下3个重要的函数参数: createCombiner: V => C ,这个函数把当前的值作为参数,...

qq_41848129的博客 313

一步步教你使用 NVIDIA 推出的全新GPU加速求解器 cuOpt:解锁超高效率的求解体验

未完成

Linshaodan520的博客 871
上一篇: Apache Hadoop与第三方Hadoop-CDH,HDP,MapR的分析与比较
下一篇: python选取特定列——pandas的iloc和loc以及icol使用(列切片及行切片)
程序员椰子橙
博客等级 码龄9年 46粉丝 163原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值