黑猴子的家:Spark 创建 RDD

在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。我们可以先看看这两个函数的声明

9193428-3f93f701abcb7c49.png

9193428-5bebed8f07dd4458.png
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 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值