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)

  

原文地址:https://www.cnblogs.com/Lyh1997/p/11171111.html