Spark parallelize函数和makeRDD函数的区别(Array-->RDD)

我们知道,在Spark中创建RDD的创建方式大概可以分为三种:
[b](1)、从集合中创建RDD;[/b]
[color=red][b](2)、从外部存储创建RDD;[/b][/color]
[color=blue][b](3)、从其他RDD创建。[/b][/color]

而从集合中创建RDD,[b]Spark主要提供了两中函数:parallelize和makeRDD[/b]。我们可以先看看这两个函数的声明:

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

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

def makeRDD[T:ClassTag](seq:Seq[(T, Seq[String])]):RDD[T]


我们可以从上面看出makeRDD有两种实现,[b]而且第一个makeRDD函数接收的参数和parallelize完全一致。其实第一种makeRDD函数实现是依赖了parallelize函数的实现[/b],来看看Spark中是怎么实现这个makeRDD函数的:


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


我们可以看出,这个makeRDD函数完全和parallelize函数一致。但是我们得看看第二种makeRDD函数函数实现了,它接收的参数类型是Seq[(T, Seq[String])],Spark文档的说明是


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.


原来,[color=red][b]这个函数还为数据提供了位置信息[/b][/color],来看看我们怎么使用:

scala>val iteblog1= sc.parallelize(List(1,2,3))  
iteblog1:org.apache.spark.rdd.RDD[Int] =ParallelCollectionRDD[10] at parallelize at <console>:21

scala>val iteblog2= sc.makeRDD(List(1,2,3))
iteblog2:org.apache.spark.rdd.RDD[Int] =ParallelCollectionRDD[11] at makeRDD at <console>:21

scala>val seq =List((1, List("iteblog.com","sparkhost1.com","sparkhost2.com")),
| (2, List("iteblog.com","sparkhost2.com")))
seq:List[(Int, List[String])] =List((1,List(iteblog.com, sparkhost1.com, sparkhost2.com)),
(2,List(iteblog.com, sparkhost2.com)))

scala>val iteblog3= sc.makeRDD(seq)
iteblog3:org.apache.spark.rdd.RDD[Int] =ParallelCollectionRDD[12] at makeRDD at <console>:23

scala> iteblog3.preferredLocations(iteblog3.partitions(1))
res26:Seq[String] =List(iteblog.com, sparkhost2.com)

scala> iteblog3.preferredLocations(iteblog3.partitions(0))
res27:Seq[String] =List(iteblog.com, sparkhost1.com, sparkhost2.com)

scala> iteblog1.preferredLocations(iteblog1.partitions(0))
res28:Seq[String] =List()


我们可以看到,makeRDD函数有两种实现,[b]第一种实现其实完全和parallelize一致;而第二种实现可以为数据提供位置信息,而除此之外的实现和parallelize函数也是一致的[/b],如下:


def parallelize[T:ClassTag](
seq:Seq[T],
numSlices:Int =defaultParallelism):RDD[T] =withScope {
assertNotStopped()
newParallelCollectionRDD[T](this, seq, numSlices, Map[Int, Seq[String]]())
}

def makeRDD[T:ClassTag](seq:Seq[(T, Seq[String])]):RDD[T] =withScope {
assertNotStopped()
valindexToPrefs =seq.zipWithIndex.map(t => (t._2, t._1._2)).toMap
newParallelCollectionRDD[T](this, seq.map(_._1), seq.size, indexToPrefs)
}


都是返回ParallelCollectionRDD,而且这个[b]makeRDD的实现不可以自己指定分区的数量,而是固定为seq参数的size大小。[/b]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值