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