RDD的创建方式
-
从外部存储系统中获取
-
从父RDD转换得到新的RDD
-
调用SparkContext的parallelize方法,将Driver上的数据集并行化,转化为分布式的RDD。
-
更改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