Spark学习 -- RDD
一、RDD是什么
RDD,全称为 Resilient Distributed Datasets,是一个容错的、并行的数据结构,可以让用户显式地将数据存储到磁盘和内存中,并能控制数据的分区。
RDD是只读的、分区记录的集合。RDD只能基于在稳定物理存储中的数据集和其他已有的RDD上执行确定性操作来创建。这些确定性操作称之为转换,如map、filter、groupBy、join(转换不是程开发人员在RDD上执行的操作)
RDD 还提供了诸如 join、groupBy、reduceByKey 等更为方便的操作(注意,reduceByKey 是 action,而非 transformation),以支持常见的数据运算。
二、RDD性质
一个RDD是一个不可变化的分布式集合对象
Spark中所有的计算都是通过RDDs的创建、转换、操作完成的
一个RDD内部有许多的partitions(分片)组成的
三、partitions(分片)
每个分片包括一部分数据,partitions可在集群不同节点上计算
分片是Spark并行处理的单元,Spark顺序的,并行的处理分片
四、RDD的创建方法
1、把一个存在的集合传给SparkContext的parallelize()方法,一般是在测试的时候用
val rdd = sc.parallelize(Array(1,2,4,5),4)
参数 1: 待并行处理的数据集合; 参数 2: 分区个数。 代码如下:
2、加载外部数据集
val rddText = sc.textFile(文件路径)
五、Transformation(转换)
从之前的RDD构建一个新的RDD,像map() 和 filter()
1、逐元素Transformation
* map():
map()接收函数,把函数应用到RDD的每一个元素,返回新的RDD
scala> val lines = sc.parallelize(Array("hello","spark","hello","world","!")) lines: org.apache.spark.rdd.RDD[String] = ParallelCollectionRDD[11] at parallelize at <console>:24 scala> lines.foreach(print) helloworld!sparkhello scala> lines.foreach(println) hello hello ! world spark scala> val lines2 = lines.map(word => (word, 1)) lines2: org.apache.spark.rdd.RDD[(String, Int)] = MapPartitionsRDD[12] at map at <console>:25 scala> lines2.foreach(println) (hello,1) (world,1) (hello,1) (!,1) (spark,1)
* filter():
filter()接收函数,返回只包含满足filter()函数的元素的新RDD
scala> val lines3 = lines.filter(word => word.contains("hello")) lines3: org.apache.spark.rdd.RDD[String] = MapPartitionsRDD[13] at filter at <console>:25 scala> lines3.foreach(println) hello hello
* flatMap():
对每个输入元素,输出多个输出元素
flat压扁的意思,将RDD中元素压扁之后返回一个新的RDD
scala> val inputs = sc.textFile("/Users/hunter/LYH/word.text") scala> val lines = inputs.flatMap(line=>line.split(" ")) lines: org.apache.spark.rdd.RDD[String] = MapPartitionsRDD[16] at flatMap at <console>:25 scala> lines.foreach(println)