RDD分区概述

1.RDD是一个基本的抽象,操作RDD就像操作一个本地集合一样,降低了编程的复杂度
RDD里面并不存储真正要计算的数据,你对RDD进行操作,他会在Driver端转换成task,下发到Executor计算分散在多台集群上的数据

RDD的算子分为两类,一类是Transformation(lazy),一类是Action(触发任务执行)
RDD不存真正要计算的数据,而是记录了RDD的转换关系(调用了什么方法,传入什么函数)

 *  - A function for computing each split  (每一个切片都会有一个函数作业在上面用于对数据进行处理)
 *  - A list of dependencies on other RDDs  (RDD和RDD之间存在依赖关系)
 *  - Optionally, a Partitioner for key-value RDDs (e.g. to say that the RDD is hash-partitioned)
     (可选,key value类型的RDD才有RDD[(K,V)])如果是kv类型的RDD,会一个分区器,默认是hash-partitioned
 *  - Optionally, a list of preferred locations to compute each split on (e.g. block locations for
 *    an HDFS file)
     (可以,如果是从HDFS中读取数据,会得到数据的最优位置(向Namenode请求元数据))

创建RDD有哪些中方式呢?
    1.通过外部的存储系统创建RDD(一般是从hdfs系统中读取文件,或者读取外部文件)
    2.将Driver的Scala集合(Java中的集合不能)通过并行化的方式编程RDD(试验、测验)
    3.调用一个已经存在了的RDD的Transformation,会生成一个新的RDD

    RDD的Transformation的特点
    1.lazy
    2.生成新的RDD

spark中join操作,只能按照key来join,并且是等值join

RDD分区的数据取决于哪些因素?
    1.如果是将Driver端的Scala集合并行化创建RDD,并且没有指定RDD的分区,RDD的分区就是为该app分配的中的核数cores(--total-executor-cores),可以充分利用计算资源,提高效率
    2.如果是从hdfs中读取数据创建RDD,并且设置了最新分区数量是1,那么RDD的分区数据就是输入切片的数据,如果不设置最小分区的数量,即spark调用textFile时会默认传入2,那么RDD的分区数量会大于等于输入切片的数量

RDD的map方法,是Executor中执行时,是一条一条的将数据拿出来处理


mapPartitionsWithIndex 一次拿出一个分区(分区中并没有数据,而是记录要读取哪些数据,真正生成的Task会读取多条数据),并且可以将分区的编号取出来

功能:取分区中对应的数据时,还可以将分区的编号取出来,这样就可以知道数据是属于哪个分区的(哪个区分对应的Task的数据)

    //该函数的功能是将对应分区中的数据取出来,并且带上分区编号
    val func = (index: Int, it: Iterator[Int]) => {
      it.map(e => s"part: $index, ele: $e")
    }
 

 

aggregateByKey   是Transformation
reduceByKey      是Transformation
filter           是Transformation
flatMap             是Transformation
map              是ransformation
mapPartition     是ransformation
mapPartitionWithIndex 是ransformation


collect          是Action
aggregate        是Action
saveAsTextFile   是Action
foreach          是Action
foreachPartition 是Action

### RDD 的概念 RDD (Resilient Distributed Dataset),即弹性分布式数据集,是一种分区的只读记录集合[^2]。此数据集不局限于磁盘文件,还可以来自其他类型的稳定存储介质或者由其他的 RDD 经过一系列确定性的操作转换而来。这些确定性操作被称为变换,例如 `map`、`filter` 和 `join` 等。 ### RDD 的特性 #### 不可变性 一旦创建,RDD 中的内容便不可更改;任何对 RDD 执行的操作都会生成新的 RDD 实例而不是修改现有的实例[^3]。 #### 分区属性 RDD 是分布式的,意味着它可以跨多台计算机节点进行分割成不同的部分(称为分区)。这种设计允许 Spark 并行处理大规模的数据集,并且能够有效地利用集群资源。 #### 容错机制 由于 RDD 记录了其构建过程中的所有依赖关系,因此即使某些计算丢失或失败,也能够重新计算得到相同的结果而不必担心数据的一致性和完整性问题。 #### 延迟评估 除非遇到行动算子(action operator), 否则所有的变换都是惰性求值(lazy evaluation) 。这意味着只有当真正需要结果的时候才会触发实际的计算流程。 ### 创建 RDD 方法 可以通过两种主要途径来创建 RDD: - **从外部数据源加载**:这通常涉及到读取 HDFS 文件或者其他支持的数据格式。 - **基于现有集合**:可以直接从内存里的 Scala 集合类型如 List 或 Array 来初始化一个 RDD。例如,在 Spark Shell 中可以使用 `sc.parallelize()` 函数将本地序列转化为 RDD 对象[^4]。 ```scala val data = sc.parallelize(List(1, 2, 3)) ``` ### 操作类型 对于 RDD 而言有两种重要的操作类别——变换(transformations)和动作(actions): - **Transformations**: 这些是对输入 RDD 施加某种形式的变化从而产生另一个 RDD 的指令。常见的例子包括但不限于映射(map)、过滤(filter)以及连接(join)。 - **Actions**: 动作则是指那些会促使整个 DAG(Directed Acyclic Graph)被执行并返回具体数值给驱动程序的过程。典型的 action 包含 collect() 收集全部元素至单机端、count() 获取总数目等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值