RDD实现

这篇博客深入探讨了Spark的弹性分布式数据集(RDD)实现,包括解析器集成、内存管理策略,以及各种RDD操作如创建、转换和行动操作。内存管理采用LRU算法,RDD编程接口涉及分区、依赖关系和计算方式。转换操作如map、flatMap、distinct和repartition等,以及键值对操作如reduceByKey和join等都有详尽解释。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

解析器集成

Scala解析器处理一般过程:

1 将用户输入每一行编译成一个类
2 将该类载入到JVM中
3 调用该类中的某个函数

内存管理

1 未序列化Java对象存储在内存中
2 序列化的数据存于内存中
3 存于磁盘中
内存使用LRU(最近最少)回收算法管理

RDD编程接口

1 RDD分区(Partitions)
2 RDD首选位置(PreferredLocations):离数据最近的位置
3 RDD依赖关系(Dependencies):窄依赖和宽依赖
  >窄依赖:每个父类RDD的分区都至多被一个子RDD的分区使用
  >宽依赖:多个子RDD的分区依赖同一个父RDD的分区
这里写图片描述
4 RDD分区计算(Iterator)
5 RDD分区函数(Partitioner)
  >哈希分区划分器(HashPartitioner)
  >范围分区划分器(RangePartitioner)
  且Partitioner只存在键值对RDD中,非键值对RDD其partitioner值为None

创建操作

1.并行化集合创建操作
parallelize、makeRDD—-后者可以指定每一个分区的首选位置
2.外部存储创建操作
textFile、wholeTextFiles、SequenceFile(针对Hadoop存储二进制形式的键值对)、hadoopFile、newAPIHadoopFile

转换操作

map与flatMap
  原RDD中每个元素经过map处理后只能生成一个新的元素,而经过flatMap每个元素可以生成1个或多个元素构成新的RDD,flatMap多用于分词
distinct
  去掉RDD中的重复元素
coalesce与repartition
  都是对RDD的重新分区,coalesce操作使用HashPartitioner,第一个参数为重分区数目。第二个参数为是否shuffle,默认false;repartition是coalesce第二个参数为true的情况
randomSplit与glom
  都是对RDD的划分,randomSplit操作根据weights权重将一个RDD划分为多个RDD,其返回结果为Array[RDD[T]];glom操作是根据RDD的partition作为划分,返回结果是为RDD[Array[T]]
union、intersection与subtract
  union是两个RDD的并集,返回元素不去重;interserction是两个RDD的交集,返回元素去重;subtract返回在rdd中出现,other中不出现的元素,返回元素不去重。
mapPartition与mapPartitionWithInedx
  mapPartition与map相比,映射的参数由RDD中的每个元素变成了每个RDD分区的迭代器(在映射中频繁创建额外对象,mapPartition效率要高)。mapPartitionWithIndex操作类似与mapPartition,只是输入参数多了一个分区索引
zip与zipPartitions
  zip是将两个RDD组合成键值对形式(默认RDD的partition数与元组都是一样的);zipPartitions将多个RDD按照Partitions组合,对每个分区内元素数无要求
zipWithIndex与zipWithUniqueId
  zipWithIndex操作将RDD中的元素和这个元素所在的RDD中ID(索引号)组合成键值对;zipWithUniqueId操作将RDD中的元素与一个唯一ID组和成键值对。
  每个分区中第一个元素的唯一ID:该分区的索引号
  每个分区中第N 个元素的唯一ID:前一个元素的唯一ID+该RDD的总分区数

键值对转换操作

partitionBy、mapValues、flatMapValues
  partitionBy操作是根据partitioner函数生成新的ShuffleRDD,将原RDD重新分区;
  mapValues操作类似map,不过只针对Values;FlatMapValues也是类似。
combineByKey与foldByKey
  combineByKey操作用于将RDD[K,V]转换成RDD[K,C],V、C类型不必相同。foldByKey操作是根据key对value折叠、合并处理,预先把V映射到每个value上。
  注:combineByKey中参数含义:
  createCombiner:组合器函数,用于将V类型变成C类型
  mergeValue:合并值函数,将一个C类型和一个V类型合并成一个C类型
  mergeCombiner:合并组合数函数,将两个C合并成一个C
  numPartitions、partition:分区数与分区方法
  mapSideCombine:是否需要在Map端进行combine操作
reduceByKey与groupByKey
  reduceByKey操作用于将RDD[K,V]中每个K对应的V值根据映射函数来运算;groupByKey操作用于将RDD[K,V]中K对应的V合并到一个Iterable[V]中
  注:reduceByKeyLocally操作将结果映射到一个Map[K,V]中。
cogroup
  cogroup相当于SQL中的全外关联,返回左右RDD中的记录,关联不上的为空。
join、fullOuterJoin、leftOuterJoin、rightOuterJoin、subtractByKey
  join、fullOuterJoin、leftOuterJoin、rightOuterJoin都是针对RDD[K,V]中K值相等的连接操作,分别对应于内连接、全连接、左连接、右连接,这些操作都是调用cogroup进行实现的。subtract
ByKey是针对键值的,输出只存在左边的键值对

控制操作

cache、persist、checkpoint
  cache(MEMORY_ONLY)是persist的一种特例,checkpoint设置检查点(sc.setCheckpointDir(“”))
  例如a.persist(org.apache.spark.storage.StorageLevel.DISK_ONLY)

行动操作
集合标量行动操作
函数功能
first()返回RDD中第一个元素
count()RDD中元素个数,类型Long
collect()汇集节点数据,将RDD转换成数组
collectAsMap()汇集节点数据,将RDD转换成Map
take(n)从RDD中取n个元素
top(n)按照升序(或降序、某种规则),取n个元素
takeOrdered(n)与top类似,不过取的顺序相反
aggregate()
fold()
lookup()返回RDD中K对应的所有V
countByKey()统计Key的数量,返回为Map类型
countByValue()按Value统计,返回为Map类型
foreach()循环
foreachPartition()循环单位为Partition
sortBy()排序,默认为true、升序
存储行动操作
函数功能
saveAsTextFile()保存为文本文件格式
saveAsSequenceFile()以Sequence文件保存到HDFS上
saveAsObjectFile()将RDD中的元素序列化,存储在文件中
saveAsHadoopFile()支持老版本Hadoop API
saveAsHadoopDataset()将RDD保存到除了HDFS以外的其他存储,例如HBase
saveAsNewAPIHadoopFile()支持新版本Hadoop API
补充算子
函数功能
cartesian()返回两个RDD的元素的笛卡尔积
countApproxDistinct()计算不同值的近似数??
countApproxDistinctByKey()
filter()过滤
filterByRange()经过sortByKey之后的过滤
getCheckpointFile()获取检查点
isCheckpoint()是否已被存储
histogram()
takeSample()采样
variance()方差

更详细的RDD实例:
http://homepage.cs.latrobe.edu.au/zhe/ZhenHeSparkRDDAPIExamples.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值