我们知道,在Spark中创建RDD的创建方式大概可以分为三种:
(1)、从集合中创建RDD;(2)、从外部存储创建RDD;(3)、从其他RDD创建。
而从集合中创建RDD,Spark主要提供了两中函数:parallelize和makeRDD。
我们可以先看看这两个函数的声明:
Spark提供了两种创建RDD的方式:
读取外部数据集,以及在驱动器程序中对一个集合进行并行化。
在驱动器程序中对一个集合进行并行化的方式有两种:parallelize()和makeRDD()。
1、parallelize()
def parallelize[T: ClassTag](
seq: Seq[T],
numSlices: Int = defaultParallelism): RDD[T] = withScope {
assertNotStopped()
new ParallelCollectionRDD[T](this, seq, numSlices, Map[Int, Seq[String]]())
}
2、makeRDD(),有两种重构方法,如下:
2.1、方法一:
/** Distribute a local Scala collection to form an RDD.
*
* This method is identical to `parallelize`.
*/
def makeRDD[T: ClassTag](
seq: Seq[T],
numSlices: Int = defaultParallelism): RDD[T] = withScope {
parallelize(seq, numSlices)
}
可以发现,该重构方法的实现就是调用parallelize()方法。
2.2、方法二:
/**
* Distribute a local Scala collection to form an RDD, with one or more
* location preferences (hostnames of Spark nodes) for each object.
* Create a new partition for each collection item.
*/
def makeRDD[T: ClassTag](seq: Seq[(T, Seq[String])]): RDD[T] = withScope {
assertNotStopped()
val indexToPrefs = seq.zipWithIndex.map(t => (t._2, t._1._2)).toMap
new ParallelCollectionRDD[T](this, seq.map(_._1), math.max(seq.size, 1), indexToPrefs)
}
注释的意思为:分配一个本地Scala集合形成一个RDD,为每个集合对象创建一个最佳分区。
给出如下例子,可以更清晰的看到它们之间的区别:
首先定义集合对象:
val seq = List(("American Person", List("Tom", "Jim")), ("China Person", List("LiLei", "HanMeiMei")), ("Color Type", List("Red", "Blue")))
使用parallelize()创建RDD:
val rdd1 = sc.parallelize(seq)
查询rdd1的分区数:
rdd1.partitions.size // 2
使用makeRDD()创建RDD
val rdd2 = sc.makeRDD(seq)
查看rdd2的分区数
rdd2.partitions.size // 3
总之:
第一种makerdd与parallerize两者完全一致,传递的都是集合的形式;其实第一种makerdd实现是依赖了parallelize函数
第二种makerdd还提供了计算位置。
————————————————
版权声明:本文为CSDN博主「道法—自然」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/wyqwilliam/article/details/84330408