RDD是什么:分布式弹性数据集
待解决的问题:rdd和数据源分区数据如何进行分配???
例如(1,2,3,4),分区数numSlices=3,RDD中如何进行数据分区存储?
查看源码能够让我们快速理解。
进到makeRDD函数,看到内部是执行了parallelize函数,并且传入集合和分区数。
parallelize函数内部创造了一个ParallelCollectionRDD对象。
随后,进入ParallelCollectionRDD类内部。
有个同名方法:
将集合切片为numSlices子集合。我们在这里做的另一件事情是处理范围特别是集合,将切片编码为其他范围以最小化内存成本。这使得在表示大量数据集的RDD上运行Spark是非常有效的。如果收集是一个包含范围,我们对最后一个切片使用包含范围。
在slice函数和position函数之后,需要进行模式匹配。
case 1:范围Range,如果范围是包含,则对最后一个切片使用“包含范围”
case 2:用于长、双精度、大整数等范围
case 3:其他->进行position函数
position函数输入(集合的长度,分区数),并且对于[0,numSlices)进行迭代(until左闭右开)
根据规则计算start和end,最后会获得分区规则。
//例如(1,2,3,4,5) numslices=3 -> 对0,1,2迭代
//产生三个分区规则(0,1](1,3](3,5]
然后利用slice进行array切分。
即为(1)(2,3)(4,5)