最新版本spark3.0.0中mkRDD分区数据存储原理

spark中从内存中创建RDD,也叫从集合中创建

有两种方式创建:

 //第一种
 val rdd = sc.parallelize(List(1,2,3,4,5))
 //第二种
 val rdd = sc.makeRDD(List(1,2,3,4,5))

其实在底层makeRDDR方法调用的还是parallelize方法

def makeRDD[T: ClassTag](
      seq: Seq[T],
      numSlices: Int = defaultParallelism): RDD[T] = withScope {
    parallelize(seq, numSlices)
  }

我们仔细看这个方法其实是有有两个参数的,我们传一个参数就可以正常运行了,是因为第二个参数有默认值,那么第二个参数代表什么含义呢?

官方注释解释

number of partitions to divide the collection into

//表示的是将数据集合分区的数量

如下图所示表示第二个参数默认不写的值(需要考虑当前运行的环境)

在这里插入图片描述

知道两个参数的含义之后,我们接下来看底层源码到底是怎么分区的

参数spark.default.parallelism默认是没有设置的,所以在默认情况下调用的就是当前运行环境下的核数

进入到ParallelCollectionRDD.scala中

在这里插入图片描述

再往下走

在这里插入图片描述

具体的数据分区存储的规则

在这里插入图片描述

这样我们能知道具体的分区的数据的左右边界,并通过上面该方法获取具体的分区存储的数据

array.slice(start, end)

在这里插入图片描述

这样我们知道了(start,end)其实是前闭后开的区间,我们根据具体实际情况能够非常清楚知道了makeRDD是怎么分区存储数据的了

如上面写的将list集合分区成三个,如下所示

List => 12345

length = 5 
splits = 3

//分区存储数据
0 [0,1) => 1
1 [1,3) => 2 3
2 [3,5) => 4 5
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值