Spark-RDD创建方式

本文介绍了Spark中RDD的创建方式,包括从外部存储系统获取、从父RDD转换以及使用SparkContext的parallelize方法。还讨论了RDD的持久性设置,如使用cache函数。RDD的构造分为从文件系统和内存中创建,如textFile方法和parallelize方法。此外,文章提到了RDD操作的两类:转化操作和行动操作,并举例说明了常见的操作如map、filter和reduce、count。最后,提到了RDD的分区、数据本地化和依赖关系等概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

RDD的创建方式

  1. 从外部存储系统中获取

  2. 从父RDD转换得到新的RDD

  3. 调用SparkContext的parallelize方法,将Driver上的数据集并行化,转化为分布式的RDD。

  4. 更改RDD的持久性(persistence),例如cache()函数。默认RDD计算后会在内存中清除。通过cache函数将计算后的RDD缓存在内存中。

    创建方式两种:

    #第一类方式是通过文件系统构造RDD,代码如下所示:
    val rdd1 = sc.textFile(“hdfs://centos:9000/input/data.txt”) #
    val rdd1 = sc.textFile("/input/data.txt") #
    #这里例子使用的是本地文件系统,所以文件路径协议前缀是file://。
    val rdd3 = sc.textFile(“file:///D:/sparkdata.txt”, 1)
    val rdd3:RDD[String] = sc.textFile(“file:///D:/sparkdata.txt”, 1)

    #第二类方式从内存里构造RDD,使用的方法:makeRDD和parallelize方法
    val rdd01 =sc.makeRDD(List(1,2,3,4))
    val rdd02 = sc.parallelize(List(1,2,3,4))
    val rdd2 = sc.parallelize(Array(1,2,3,4,5),2) #第二个参数2是设置的分区
    大家看到了RDD本质就是一个数组,因此构造数据时候使用的是List(链表)和Array(数组)类型。

构造了RDD对象了,接下来就是如何操作RDD对象了,RDD的操作分为转化操作(transformation)和行动操作(action),RDD之所以将操作分成这两类这是和RDD惰性运算有关,当RDD执行转化操作时候,实际计算并没有被执行,只有当RDD执行行动操作时候才会促发计算任务提交,执行相应的计算操作。区别转化操作和行动操作也非常简单,转化操作就是从一个RDD产生一个新的RDD操作,而行动操作就是进行实际的计算。

RDD的操作类型

RDD的操作类型分为两种:Transformation(转换)与Action(行动)。

1.  Transformation(变换)

Transformation操作是延迟计算的,也就是说从一个RDD转换生成另一个RDD的转换操作不是马上执行,需要等到有Actions操作时,才真正触发运算。常见的转换操作有map、filter等。

2.  Action(行动)

Action操作会触发Spark提交任务(Job),并将数据输出到spark系统。常见的Action操作有reduce、count等

      Spark的转换和行动操作的特点与pig极为相似,都是在数据碰到真正的行动类型的操作时所有的操作才开始执行。

开发者可以指明他们需要重用哪些RDD,然后选择一种存储策略(如:in-memory storage)将它们保存起来。开发者还可以让RDD根据记录中的键值在集群的机器之间重新分区。这对于RDD的位置优化是非常有用的。例如,让将要进行join操作的两个数据集以同样的方式进行哈希分区(类似于hive中的分桶操作可以提升join效率)。

Spark中的RDD的常用方法:

partition 分区,一个RDD会有一个或者多个分区
preferredLocations 对于分区p而言,返回数据本地化计算的节点
dependencies() RDD的依赖关系
compute(p,context) 对于分区p而言,进行迭代计算
partitioner() RDD的分区函数

RDD 创建

new SparkContext(master: String, appName: String, sparkHome: String = null, jars: Seq[String] = Nil, environment: Map[String, String] = Map())
Alternative constructor that allows setting common Spark properties directly

new SparkContext(master: String, appName: String, conf: SparkConf)
 Permalink
Alternative constructor that allows setting common Spark properties directly

new SparkContext()
Create a SparkContext that loads settings from system properties (for instance, when launching with ./bin/spark-submit).

new SparkContext(config: SparkConf)

方法:

def makeRDD[T](seq: Seq[(T, Seq[String])])(implicit arg0: ClassTag[T]): RDD[T] Permalink
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.

seq list of tuples of data and location preferences (hostnames of Spark nodes)

returns RDD representing data partitioned according to location preferences

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

RDD representing distributed collection

此makeRDD方法将一个本地的scala Seq(或能转换成Seq)的集合构建成一个RDD对象,根据当前机器的CPU核数创建相同个数的分区(概念稍后讲解)。

示例

scala> val rdd = sc.makeRDD(Seq(1,2,3))   //创建RDD
rdd: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[0] at makeRDD at <console>:24

scala> rdd.collect
res1: Array[Int] = Array(1, 2, 3)                                               

//此makeRDD方法将一个本地的scala Seq(或能转换成Seq)的集合构建成一个RDD对象,根据当前机器的CPU核数创建相同个数的分区(概念稍后讲解)。
scala> rdd.partitions.size
res2: Int = 2
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值