在Spark中创建RDD的创建方式大概可以分为三种
(1)从集合中创建RDD;
(2)从外部存储创建RDD;
(3)从其他RDD创建。
1、由Scala集合创建
由一个已经存在的Scala集合创建,集合并行化
[victor@node1 ~]$ spark-shell --master spark://node1:7077
scala> val rdd1 = sc.parallelize(Array(1,2,3,4,5,6,7,8))
从集合中创建RDD,Spark主要提供了两种函数:parallelize和makeRDD。我们可以先看看这两个函数的声明
def parallelize[T: ClassTag](
seq: Seq[T],
numSlices: Int = defaultParallelism): RDD[T] = withScope {
assertNotStopped()
new ParallelCollectionRDD[T](this, seq, numSlices, Map[Int, Seq[String]]())
}
def makeRDD[T: ClassTag](
seq: Seq[T],
numSlices: Int = defaultParallelism): RDD[T] = withScope {
parallelize(seq, numSlices)
}
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)
}
我们可以从上面看出makeRDD有两种实现,而且第一个makeRDD函数接收的参数和parallelize完全一致。其实第一种makeRDD函数的实现是依赖了parallelize函数的实现, 我们可以看出,这个makeRDD函数完全和parallelize函数一致。我们看看第二种makeRDD函数实现,它接收的参数类型是Seq[(T, Seq[String])],Spark文档的说明是这个函数还为数据提供了位置信息,来看看我们怎么使用
scala> val victor1= sc.parallelize(List(1,2,3))
victor1: org.apache.spark.rdd.RDD[Int]
= ParallelCollectionRDD[10] at parallelize at <console>:21
scala> val victor2 = sc.makeRDD(List(1,2,3))
victor2: org.apache.spark.rdd.RDD[Int]
= ParallelCollectionRDD[11] at makeRDD at <console>:21
scala> val seq = List((1, List("slave01")),(2, List("slave02")))
seq: List[(Int, List[String])] = List((1,List(slave01)),(2,List(slave02)))
scala> val victor3 = sc.makeRDD(seq)
victor3: org.apache.spark.rdd.RDD[Int]
= ParallelCollectionRDD[12] at makeRDD at <console>:23
scala> victor3.preferredLocations(victor3.partitions(1))
res2: Seq[String] = List(slave02)
scala> victor3.preferredLocations(victor3.partitions(0))
res3: Seq[String] = List(slave01)
scala> victor1.preferredLocations(victor1.partitions(0))
res4: Seq[String] = List()
我们可以看到,makeRDD函数有两种实现,第一种实现其实完全和parallelize一致;而第二种实现可以为数据提供位置信息,而除此之外的实现和parallelize函数也是一致的,都是返回ParallelCollectionRDD,而且这个makeRDD的实现不可以自己指定分区的数量,而是固定为seq参数的size大小
2、由外部存储系统的数据集创建
包括本地的文件系统,还有所有Hadoop支持的数据集,比如HDFS、Cassandra、HBase等
scala> val victor = sc.textFile("hdfs://node1:9000/user/admin/RELEASE")
victor: org.apache.spark.rdd.RDD[String]
= hdfs://node1:9000/user/admin/RELEASE MapPartitionsRDD[1] at textFile at <console>:27
3、从集合中创建RDD有两种方式
parallelize 和 makeRDD