Spark key-value类型算子总结(图解和源码)

星火X2国产大模型全栈解析:MoE架构与全国产算力适配实践 大模型推理与训练正从依赖CUDA生态走向全国产算力底座,其核心挑战在于如何在昇腾、寒武纪等芯片上实现高效稀疏计算与训推一致。MoE(专家混合)架构通过动态路由与专家专业化分工,显著降低实际计算量,而VTP虚拟张量并行、INT8 KVCache、重采样校准等技术则解决了显存墙、通信瓶颈与分布偏移等关键工程难题。这类优化不仅提升推理吞吐与能效比,更支撑教育错因定位、医疗临床路径遵循、车载模糊意图理解等强落地场景。本文聚焦星火X2在293B MoE与全国产算力协同下的真实技术路径,为AI基础设施国产化提供可复用的 阅读详情

Spark key-value类型算子

1. partitionBy()按照K重新分区
先看partitionBy函数
 def partitionBy(partitioner: Partitioner): RDD[(K, V)] = self.withScope {
    if (keyClass.isArray && partitioner.isInstanceOf[HashPartitioner]) {
      throw new SparkException("HashPartitioner cannot partition array keys.")
    }
    if (self.partitioner == Some(partitioner)) {
      self
    } else {
      new ShuffledRDD[K, V, V](self, partitioner)
    }
  }
功能说明

将RDD[K,V]中的K按照指定Partitioner重新进行分区;
如果原有的RDD和新的RDD是一致的话就不进行分区,否则会产生Shuffle过程

图解图解
代码演示(按HashPartitioner分区)
	val rdd: RDD[(Int, String)] = sc.makeRDD(Array((1,"aaa"),(2,"bbb"),(3,"ccc")),3)
    val mapRdd: RDD[(Int, String)] = rdd.partitionBy(new org.apache.spark.HashPartitioner(2))
    mapRdd.mapPartitionsWithIndex{
      (index,values)=>values.map((index,_))
    }.collect().foreach(println)
结果
(0,(2,bbb))
(1,(1,aaa))
(1,(3,ccc))
自定义分区规则

要实现自定义分区器,需要继承org.apache.spark.Partitioner类,并实现下面三个方法。
(1)numPartitions: Int:返回创建出来的分区数。
(2)getPartition(key: Any): Int:返回给定键的分区编号(0到numPartitions-1)。
(3)equals():Java 判断相等性的标准方法。这个方法的实现非常重要,Spark需要用这个方法来检查你的分区器对象是否和其他分区器实例相同,这样Spark才可以判断两个RDD的分区方式是否相同

// main方法
	val rdd: RDD[(Int, String)] = sc.makeRDD(Array((1,"aaa"),(2,"bbb"),(3,"ccc")),3)
    val mapRdd: RDD[(Int, String)] = rdd.partitionBy(new MyPartition(2))
    mapRdd.mapPartitionsWithIndex{
      (index,values)=>values.map((index,_))
    }.collect().foreach(println)
// 主要代码
class MyPartition(num:Int) extends Partitioner{
    override def numPartitions: Int = num
    override def getPartition(key: Any): Int = {
      if(key.isInstanceOf[Int]){
        val i: Int = key.asInstanceOf[Int]
        if(i%2==0){
          0
        }else{
          1
        }
      }else{
        0
      }
    }
  }
结果
(0,(2,bbb))
(1,(1,aaa))
(1,(3,ccc))
2. reduceByKey()按照K聚合V
先看reduceByKey函数
 def reduceByKey(func: (V, V) => V): RDD[(K, V)] = self.withScope {
    reduceByKey(defaultPartitioner(self), func)
  }
  
	def reduceByKey(func: (V, V) => V, numPartitions: Int): RDD[(K, V)]
功能说明

该操作可以将RDD[K,V]中的元素按照相同的K对V进行聚合。其存在多种重载形式,还可以设置新RDD的分区数
图解

代码演示
	val rdd = sc.makeRDD(List(("a",1),("b",5),("a",5),("b",2)))
    val mapRdd: RDD[(String, Int)] = rdd.reduceByKey((v1,v2)=>v1+v2)
    // 打印修改后的RDD中数据
     mapRdd.collect().foreach(println)
结果
(a,6)
(b,7)
3. groupByKey()按照K重新分组
先看groupByKey函数
def groupByKey(): RDD[(K, Iterable[V])]

def groupByKey(numPartitions: Int): RDD[(K, Iterable[V])] = self.withScope {
    groupByKey(new HashPartitioner(numPartitions))
  }
功能说明

groupByKey对每个key进行操作,但只生成一个seq,并不进行聚合。
该操作可以指定分区器或者分区数(默认使用HashPartitioner)

图解

代码演示
 	val rdd = sc.makeRDD(List(("a",1),("b",5),("a",5),("b",2)))
    val mapRdd: RDD[(String, Iterable[Int])] = rdd.groupByKey(2)
    // 打印修改后的RDD中数据
    mapRdd.mapPartitionsWithIndex{
      (index,values)=>values.map((index,_))
    }.collect().foreach(println)
结果
(0,(b,CompactBuffer(5, 2)))
(1,(a,CompactBuffer(1, 5)))
4. aggregateByKey()按照K处理分区内和分区间逻辑
先看aggregateByKey函数
def aggregateByKey[U: ClassTag](zeroValue: U)(seqOp: (U, V) => U,
      combOp: (U, U) => U): RDD[(K, U)] = self.withScope {
    aggregateByKey(zeroValue, defaultPartitioner(self))(seqOp, combOp)
  }
功能说明

(1)zeroValue(初始值):给每一个分区中的每一种key一个初始值;
这个初始值的理解:
如何求最大值,所有的值为正数,设置为0,如果有负值,设置为 负无穷
这个初始值就是与第一个值进行比较,保证第一次对比下去
(2)seqOp(分区内):函数用于在每一个分区中用初始值逐步迭代value;
(3)combOp(分区间):函数用于合并每个分区中的结果。

图解

代码演示
	val sc: SparkContext = new SparkContext(conf)
    val rdd: RDD[(String, Int)] = sc.makeRDD(List(("a", 3), ("a", 2), ("c", 4), ("b", 3), ("c", 6), ("c", 8)), 2)
    val mapRdd: RDD[(String, Int)] = rdd.aggregateByKey(0)(math.max(_,_),_+_)
结果
(b,3)
(a,3)
(c,12)
5. foldByKey()分区内和分区间相同的aggregateByKey()
先看foldByKey函数
def aggregateByKey[U: ClassTag](zeroValue: U)(seqOp: (U, V) => U,
      combOp: (U, U) => U): RDD[(K, U)] = self.withScope {
    aggregateByKey(zeroValue, defaultPartitioner(self))(seqOp, combOp)
  }
功能说明

参数zeroValue:是一个初始化值,它可以是任意类型
参数func:是一个函数,两个输入参数相同

图解

代码演示
 	val list = List(("a",1),("a",1),("a",1),("b",1),("b",1),("b",1),("b",1),("a",1))
    val rdd = sc.makeRDD(list,2)
    rdd.foldByKey(0)(_+_).collect().foreach(println)
结果
(b,4)
(a,4)
6. combineByKey()转换结构后分区内和分区间操作
先看combineByKey函数
def combineByKey[C](
      createCombiner: V => C,
      mergeValue: (C, V) => C,
      mergeCombiners: (C, C) => C): RDD[(K, C)] = self.withScope {
    combineByKeyWithClassTag(createCombiner, mergeValue, mergeCombiners)(null)
  }

功能说明

(1)createCombiner(转换数据的结构): combineByKey() 会遍历分区中的所有元素,因此每个元素的键要么还没有遇到过,要么就和之前的某个元素的键相同。如果这是一个新的元素,combineByKey()会使用一个叫作createCombiner()的函数来创建那个键对应的累加器的初始值
(2)mergeValue(分区内): 如果这是一个在处理当前分区之前已经遇到的键,它会使用mergeValue()方法将该键的累加器对应的当前值与这个新的值进行合并
(3)mergeCombiners(分区间): 由于每个分区都是独立处理的,因此对于同一个键可以有多个累加器。如果有两个或者更多的分区都有对应同一个键的累加器,就需要使用用户提供的 mergeCombiners()方法将各个分区的结果进行合并。

针对相同K,将V合并成一个集合

代码演示(计算每个key出现的次数以及可以对应值的总和,再相除得到结果)
 	val list: List[(String, Int)] = List(("a", 88), ("b", 95), ("a", 91), ("b", 93), ("a", 95), ("b", 98))
    val input: RDD[(String, Int)] = sc.makeRDD(list, 2)
    input.combineByKey(
      (_,1),
      (acc:(Int,Int),v)=>(acc._1+v,acc._2+1),
      (acc1:(Int,Int),acc2:(Int,Int))=>(acc1._1+acc2._1,acc1._2+acc2._2)
    ).map(item=>item._2._1/item._2._2.toDouble).collect().foreach(println)
结果
95.33333333333333
91.33333333333333
reduceByKey、foldByKey、aggregateByKey、combineByKey对比

reduceByKey的底层源码

def reduceByKey(partitioner: Partitioner, func: (V, V) => V): RDD[(K, V)] = self.withScope {
    combineByKeyWithClassTag[V]((v: V) => v, func, func, partitioner)
  }

第一个初始值不变,也即不用直接给出初始值,分区内和分区间的函数相同

foldByKey的底层源码

combineByKeyWithClassTag[V]((v: V) => 
cleanedFunc(createZero(), v),
cleanedFunc, 
cleanedFunc, 
partitioner)

初始值和分区内和分区间的函数(逻辑)相同

aggregateByKey的底层源码

 combineByKeyWithClassTag[U]((v: V) => cleanedSeqOp(createZero(), v),
cleanedSeqOp, 
combOp, 
partitioner)

初始值和分区内处理逻辑一致
分区内和分区间的函数(逻辑)不相同

combineByKey的底层源码

def combineByKeyWithClassTag[C](
      createCombiner: V => C,
      mergeValue: (C, V) => C,
      mergeCombiners: (C, C) => C)(implicit ct: ClassTag[C]): RDD[(K, C)] = self.withScope {
    combineByKeyWithClassTag(createCombiner, mergeValue, mergeCombiners, defaultPartitioner(self))
  }

把第个值变成特定的结构

7. sortByKey()排序
先看sortByKey函数
def sortByKey(
ascending: Boolean = true, 
numPartitions: Int = self.partitions.length)
      : RDD[(K, V)] = self.withScope
  {
    val part = new RangePartitioner(numPartitions, self, ascending)
    new ShuffledRDD[K, V, V](self, part)
      .setKeyOrdering(if (ascending) ordering else ordering.reverse)
  }

功能说明

在一个(K,V)的RDD上调用,K必须实现Ordered接口,返回一个按照key进行排序的(K,V)的RDD
ascending: Boolean = true 默认为升序
false为降序

代码演示(
	val rdd: RDD[(Int, String)] = sc.makeRDD(Array((3,"aa"),(6,"cc"),(2,"bb"),(1,"dd")))
    val mapRdd: RDD[(Int, String)] = rdd.sortByKey()
    // 打印修改后的RDD中数据
     mapRdd.collect().foreach(println)
(1,dd)
(2,bb)
(3,aa)
(6,cc)
8. mapValues()只对V进行操作
先看mapValues函数
def mapValues[U](f: V => U): RDD[(K, U)] = self.withScope {
    val cleanF = self.context.clean(f)
    new MapPartitionsRDD[(K, U), (K, V)](self,
      (context, pid, iter) => iter.map { case (k, v) => (k, cleanF(v)) },
      preservesPartitioning = true)
  }

功能说明

针对于(K,V)形式的类型只对V进行操作

代码演示(
	val rdd: RDD[(Int, String)] = sc.makeRDD(Array((1, "a"), (1, "d"), (2, "b"), (3, "c")))
    val mapRdd: RDD[(Int, String)] = rdd.mapValues(_+">>>>")
    // 打印修改后的RDD中数据
     mapRdd.collect().foreach(println)
结果
(1,a>>>>)
(1,d>>>>)
(2,b>>>>)
(3,c>>>>)
9. join()连接
先看join函数
def join[W](other: RDD[(K, W)]): RDD[(K, (V, W))] = self.withScope {
    join(other, defaultPartitioner(self, other))
  }

功能说明

在类型为(K,V)和(K,W)的RDD上调用,返回一个相同key对应的所有元素对在一起的(K,(V,W))的RDD

图解

代码演示(
	val rdd: RDD[(Int, String)] = sc.makeRDD(Array((1, "a"), (2, "b"), (3, "c")))
    val rdd1: RDD[(Int, Int)] = sc.makeRDD(Array((1, 4), (2, 5), (4, 6)))
    val mapRdd: RDD[(Int, (String, Int))] = rdd.join(rdd1)
    // 打印修改后的RDD中数据
     mapRdd.collect().foreach(println)
结果
(1,(a,4))
(2,(b,5))
10. cogroup()联合
先看cogroup函数
def cogroup[W](other: RDD[(K, W)]): RDD[(K, (Iterable[V], Iterable[W]))] = self.withScope {
    cogroup(other, defaultPartitioner(self, other))
  }

功能说明

在类型为(K,V)和(K,W)的RDD上调用,返回一个(K,(Iterable,Iterable))类型的RDD

图解

代码演示(
    val rdd: RDD[(Int, String)] = sc.makeRDD(Array((1,"a"),(1,"b"),(3,"c")))
    val rdd1: RDD[(Int, Int)] = sc.makeRDD(Array((1,4),(2,5),(3,6)))
    rdd.cogroup(rdd1).collect().foreach(println)
结果
(1,(CompactBuffer(a, b),CompactBuffer(4)))
(2,(CompactBuffer(),CompactBuffer(5)))
(3,(CompactBuffer(c),CompactBuffer(6)))
ML模型上线后失效?构建持续可观测性闭环的实战指南 机器学习模型部署不是终点,而是数据漂移、特征失准与服务退化的起点。从基础概念看,ML系统本质是状态敏感的数据流转化,其稳定性依赖数据契约、特征可复现性与反馈闭环;技术价值在于通过Wasserstein距离、特征SLA、分层告警等机制实现早感知、准诊断、快响应;典型应用场景覆盖金融风控、电商推荐与工业质检等高敏业务线;本文聚焦真实落地中的可观测性闭环设计,深入解析数据层校验、特征版本绑定、模型输入/输出稳定性监控等关键实践,尤其强调Wasserstein距离在分布漂移检测中的工程优化与特征生命周期管理。 阅读详情

相关推荐

服务器运维必看:当PCIe设备突然‘失联’(Surprise Down),Linux内核日志里到底发生了什么?

本文深入解析了服务器运维中PCIe设备突然‘失联’(Surprise Down)时的Linux内核日志,揭示了硬件链路、内核驱动和PCIe协议的复合型故障。通过分析AER错误日志、LTSSM状态转换和驱动错误处理流程,提供了从日志到行动的决策树和预防性维护建议,帮助运维人员快速定位和解决PCIe设备故障。

weixin_38166557的博客 719

尚硅谷大数据技术Spark教程-笔记03【SparkCore(核心编程,partitionBy、reduceByKey、groupByKey、aggregateByKey、foldByKey)】

尚硅谷大数据技术Spark教程-笔记03【SparkCore(核心编程,partitionBy、reduceByKey、groupByKey、aggregateByKey、foldByKey、combineByKey、sortByKey、join、leftOuterJoin、cogroup)】

upward 1224

【Spark】RDD操作详解3——键值型Transformation算子

Transformation处理的数据为Key-Value形式的算子大致可以分为:输入分区与输出分区一对一、聚集、连接操作。输入分区与输出分区一对一mapValuesmapValues:针对(Key,Value)型数据中的Value进行Map操作,而不对Key进行处理。 方框代表RDD分区。a=>a+2代表只对( V1, 1)数据中的1进行加2操作,返回结果为3。源码: /** * P

Jason Ding的专栏 3378

Hbase 之KeyValue结构详解

HBase 键值。这是基本的 HBase 类型。KeyValue 包装一个字节数组,并将偏移量和长度放入传递的数组中,从哪里开始将内容解释为 KeyValue。字节数组中的 KeyValue 格式为: 如何把keyValue 数据取出放到Map里...

南风知我意 1934

虚拟机Ubuntu连接USRP

笔记本通过网线连接USRP。

xiaozir的博客 2309

浅谈Android MVI架构---大自然的搬运工~~~

浅谈 Android MVI架构

hong_world的博客 2158

Redis高级数据结构——位图

Redis高级数据结构——位图 对于bool型数据,存取时使用普通的key/value会占很大的内存,可以使用位图来存放,可以大大节省存储空间。 比如用户的签到情况,1表示已签到,0表示未签到,那么一年的签到情况只需要使用一个365位(46个字节)的空间即可存储。若是使用字符串的话则需要365个字节,当用户数量庞大的时候,使用位图是非常节省空间的。 位图不是特殊的数据结构,其实就只是一个byte数组,如下图所示。 1.位图的基本操作 setbit key offset value #将位图中的offs

loser与你 523

ArcGIS学习记录—SHP文件转换为KML KMZ数据,并显示面要素相应的标注

使用相应软件操作获取KMZ数据得以下发到外业调查人员,使得矢量数据能够更显而易见,可视化,让外业人员的工作减轻许多。(过程步骤是借鉴于网络上的相关人士给的建议,根据这些建议自己做出来的步骤,可能有些粗略,有问题的话可以再进行探讨)...

qq_41046162的博客 5万+

详解二叉搜索树 --- key模型和key/value模型

带你学习二叉搜索树 --- key模型和key/value模型

阿润菜菜的博客 2287

深入解析USB3.0一致性测试的关键技术与实践指南

本文深入解析了USB3.0一致性测试的核心技术与实践指南。文章阐述了测试如何确保设备在5Gbps高速传输下的信号完整性、电源管理合规性及协议兼容性,并提供了从测试系统搭建到完整流程执行的实战经验,帮助工程师有效应对高速信号、电源与兼容性三大核心挑战。

weixin_29164091的博客 282

Jetpack Compose Navigation实战:从基础到高级导航模式

本文全面解析Jetpack Compose Navigation在Android开发中的应用,从基础导航实现到高级模式(如单任务/单顶模式),涵盖参数传递、嵌套导航、深层链接等核心功能。通过实战代码示例展示如何优化导航性能,并与ViewModel、Hilt等架构组件整合,为开发者提供高效的Compose导航解决方案。

pz890123456的博客 376

Spark Key-Value 聚合类算子解析

Spark Key-Value 聚合类算子解析 1. combineByKey() 算子 Spark 所有聚合算子都是在 combineByKeyWithClassTag 的基础上实现的,combineByKey 是Spark的一个最通用的聚合算子。 def combineByKey[C]( createCombiner: V => C, mergeValue: (C, V) => C, mergeCombiners: (C, C) => C): RDD[(K, C

qq_34117176的博客 2130

写出GD32L233/235在读写flash的区别(用于OTA功能)

在单片机里面表示 大概是 address += sizeof(uint32_t) address += sizeof(uint64_t)1.说到OTA功能,实际上 往flash 指定区域写 数据, 拷贝数据,然后 跳转, 必要时 注意单片机的偏移量。在写本文时,L233支持单字写入,而L235只有双字写入. 一个写入地址+4 一个写入地址+8。这个是 自己写的擦除一页 数据,当然可以参考 提供的demo去实现,看自己需求。接下来是 读取 双字,也就是在L235上的读取。

teleger的博客 908

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

Spark的算子的分类        从大方向来说,Spark 算子大致可以分为以下两类:      1)Transformation 变换/转换算子:这种变换并不触发提交作业,完成作业中间过程处理。      Transformation 操作是延迟计算的,也就是说从一个RDD 转换生成另一个 RDD 的转换操作不是马上执行,需要等到有 Action 操作的时候才会

清晨随笔 655

【UG\NX二次开发】多个带ui的dll怎么整合到一个dll

NX二次开发-群精选」专栏收录了那些曾散落在聊天对话框里的精彩的知识分享,这都是被遗落的宝贵财富。让我们一起向大佬学习,充满激情地进步,不断超越自己。底部联系方式,欢迎您加入一起交流。有大佬知道多个带ui的dll怎么整合到一个dll吗。

王牌飞行员_里海的博客 286

FPGA实现DDR接口

verilog// DDR2控制器状态机// 初始化序列// 发出初始化命令endendendend// 自动预充电end// 其他状态...endcaseendend。

whm128的博客 1002

SparkCore

一、RDD概述 在介绍RDD之前先介绍一下java中的IO: 缓冲流(缓冲流提高效率): 装饰者设计模式表示一种功能的扩展,在这里真正读文件的是in而不是buggerIn,javaIO强大的原因就是他可以动态的扩展他的功能 字符流: 使用BufferedReader可以一行一行的读取数据,但要注意并不是所有的字符流都可以一行一行的读数据。 前面的步骤只是转换包装并没有真正的读取,只有用的时候即...

LALALA3_3的博客 379

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

二、弹性分布式数据集RDD

一、RDD概述 1、概念 RDD(Resilient Distributed Dataset)叫做弹性分布式数据集,是Spark中最基本的数据抽象,它代表一个不可变、可分区、里面的元素可并行计算的集合。RDD具有数据流模型的特点:自动容错、位置感知性调度和可伸缩性。RDD允许用户在执行多个查询时显式地将工作集缓存在内存中,后续的查询能够重用工作集,这极大地提升了查询速度。 2、RDD属性: 1)一...

murphyZ的博客 510

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

网络算法:从图论基础到深度学习应用(万字长文)

摘要 本文系统介绍了网络算法的知识体系,从基础图论到前沿图神经网络。首先讲解了图的基本概念、表示方法和度量指标。然后详细阐述了经典算法:图的遍历(BFS/DFS)、最短路径(Dijkstra/Bellman-Ford)、最小生成树(Kruskal/Prim)、网络流和社区发现。接着分析了传统方法的局限性,引出深度学习在图数据上的应用,重点介绍了图表示学习(如Node2Vec)和图神经网络(GCN)的核心原理——消息传递机制。全文构建了从理论基础到实践应用的完整框架,为处理各类网络数据问题提供了方法论指导。

热爱技术与前沿创新,深耕科技领域,在科创中精进自我;探索技术乐趣,分享技术干货与成长心得,以技术为伴,热爱生活,在科创与生活中双向成长。 268

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Spark中RDD常见的算子:Value 类型、双 Value 类型、Key - Value 类型

Spark常见的算子

weixin_44870066的博客 1513

【算子2】spark(四):spark core:trans算子中key-value类型的算子使用说明

【算子2】spark(四):spark core:trans算子中key-value类型的算子使用说明

hiliang521的博客 573

Spark算子学习之五、Key-Vaule算子

行动算子

comeOnBaby126的博客 580

零基础入门大数据之spark中的几种key-value操作

今天记录一下spark里面的一些key-value对的相关算子。 key-value对可以简单理解为是一种认为构造的数据结构方式,比如一个字符串"hello",单看"hello"的话,它是一个字符串类型,现在假设我想把它在一个文本中出现的次数n作为一个值和"hello"一起操作,那么可以构造一种键值对(key-value)的结构来表示,也就是(hello,n)这样的结构,那么可能会问为什么要这么构...

我爱智能 3567

Spark自定义分区器步骤以及Spark自定义分区器的应用

Spark自定义分区器 要实现自定义的分区器,你需要继承 org.apache.spark.Partitioner, 并且需要实现下面的方法: 1.numPartitions 该方法需要返回分区数, 必须要大于0. 2.getPartition(key) 返回指定键的分区编号(0到numPartitions-1)。 3.equals Java 判断相等性的标准方法。这个方法的实现非常重要,Spar...

DaDiNiWangGe的博客 2022

Spark Key-Value类型

1) groupByKey案例 1.作用:groupByKey 对每一个进行操作,但只生成一个sequence 2.需求: 创建一个pairRDD,将相同key对应值聚合到一个sequence中,并计算相同对应值的相加结果 //创建一个RDD算子,指定分区数2 val ListRDD: RDD[String] = sc.makeRDD(List("Abo", "Spark", "Hadoop", "Python", "Python", "Scala", "Spark", "Spark"), 2)

changshupx的博客 655

Spark RDD转换算子-Key-Value类型总结(1)

一、partitionBy算子 将数据按照指定 Partitioner 重新进行分区。Spark 默认的分区器是 HashPartitioner 例子: def main(args: Array[String]): Unit = { val sparkConf = new SparkConf().setMaster("local[*]").setAppName("Operator") val sc = new SparkContext(sparkConf) val rdd =

hunter95671的博客 687
上一篇: Spark-单value算子总结(图解和源码)
下一篇: RDD任务切分之Stage任务划分(图解和源码)
大数据左右手
博客等级 码龄9年 475粉丝 116原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值