RDD

RDD概念

  • RDD源码中的描述:
    A Resilient Distributed Dataset (RDD), the basic abstraction in Spark. Represents an immutable,partitioned collection of elements that can be operated on in parallel. This class contains the basic operations available on all RDDs, such as map, filter, and persist. In addition,[[org.apache.spark.rdd.PairRDDFunctions]] contains operations available only on RDDs of key-value pairs, such as groupByKey and join[[org.apache.spark.rdd.DoubleRDDFunctions]] contains operations available only on RDDs of Doubles; and [[org.apache.spark.rdd.SequenceFileRDDFunctions]] contains operations available on RDDs that can be saved as SequenceFiles.All operations are automatically available on any RDD of the right type (e.g. RDD[(Int, Int)] through implicit.

  • RDD是Spark 中一种抽象的基本单元,从源码中可以总结为,RDD是一种弹性的分布式数据集(Resilient Distributed Dataset),弹性,体现在它的计算上,即RDD在计算时提供了高容错机制,使得一个RDD在损坏或丢失的时候,可以从父RDD进行重算;分布式,RDD内部是分区的,对RDD做计算就是对RDD中每个分区做计算,RDD的分区并行地运行在多个节点之上,提高计算速度;数据集,可以把RDD理解为一个数据集合,这个数据集合是不可变的,如果从一个RDD通过计算得到一个新RDD,那么这俩个RDD是不同的。

RDD的五大特性

  • 源码中的描述:
    • A list of partitions
    • A function for computing each split
    • A list of dependencies on other RDDs
    • Optionally, a Partitioner for key-value RDDs (e.g. to say that the RDD is hash-partitioned)
    • Optionally, a list of preferred locations to compute each split on (e.g. block locations for
      an HDFS file)
  • 解释:
    • 1.A list of partitions
      RDD是一个由多个partition(某个节点里的某一片连续的数据)组成的的list;将数据加载为RDD时,一般会遵循数据的本地性(一般一个hdfs里的block会加载为一个partition)。
    • 2.A function for computing each split
      RDD的每个partition上面都会有function,也就是函数应用,其作用是实现RDD之间partition的转换。
    • 3.A list of dependencies on other RDDs
      RDD会记录它的依赖 ,为了容错(重算,cache,checkpoint),也就是说在内存中的RDD操作时出错或丢失会进行重算。
    • 4.Optionally,a Partitioner for Key-value RDDs
      可选项,如果RDD里面存的数据是key-value形式,则可以传递一个自定义的Partitioner进行重新分区,例如这里自定义的Partitioner是基于key进行分区,那则会将不同RDD里面的相同key的数据放到同一个partition里面
    • 5.Optionally, a list of preferred locations to compute each split on
      最优的位置去计算,也就是数据的本地性。

RDD创建方式

SparkContext’s parallelize(并行化集合)

  • 并行化集合通过调用SparkContext的并行化方法在驱动程序(Scala Seq)中的现有集合上创建的。复制集合的元素以形成可并行操作的分布式数据集。

    1. val data = Array(1, 2, 3, 4, 5)
    2. val distData = sc.parallelize(data)
    

    parallelize()方法可以传递第二参数来设置RDD的分区数。

SparkContext’s textFile(外部数据集)

  • Spark可以从Hadoop支持的任何存储源创建分布式数据集,包括本地文件系统、HDFS、Cassandra、HBase、Amazon S3等。SCAP支持 text files, SequenceFiles,和任何其他Hadoop输入格式。

    1. 本地文件
    2. val distFile = sc.textFile("file:///home/hadoop/data/input.txt") 
    3. hdfs文件
    4. val distFile = sc.textFile("hdfs://192.168.137.120/input.txt") 
    

    textFile()方法可以传递一个文件夹也可以使用通配符来传递多个指定的格式的文件,当传递多个文件时,每一个文件为一个process,加载为一个分区。

RDD的常用算子介绍

  • RDD的算子有Transformation和Action俩类,Transformation是将一个RDD通过函数转换成一个新的RDD,Transfortmation操作被定义为lazy (懒加载)即,当Transformation一个RDD时,并不会马上执行,只有当遇到一个Action 时才会执行;Action是一个应用程序job的产生。

Transformation

  • map(func):返回一个新的RDD,该RDD由每一个输入元素经过func函数转换后组成
  • filter(func):返回一个新的RDD,该RDD由经过func函数计算后返回值为true的输入元素组成,可以理解为一种过滤操作,即,将符合条件(true)的元素返回。
  • flatMap(func): 类似于map,但是每一个输入元素可以被映射为0或多个输出元素(所以func应该返回一个序列,而不是单一元素),可以理解为元素压扁到一行进行操作。
  • groupByKey([numTasks]):在一个(K,V)的RDD上调用,返回一个(K, Iterator[V])的RDD,可以理解为按key进行分组,将同一key的值放入一个数组中。
  • reduceByKey(func, [numTasks]):在一个(K,V)的RDD上调用,返回一个(K,V)的RDD,使用指定的reduce函数,将相同key的值聚合到一起,与groupByKey类似,reduce任务的个数可以通过第二个可选的参数来设置,可以理解为按key将value进行reduce。
  • sortByKey([ascending], [numTasks]):在一个(K,V)的RDD上调用,K必须实现Ordered接口,返回一个按照key进行排序的(K,V)的RDD
  • join(otherDataset, [numTasks]):在类型为(K,V)和(K,W)的RDD上调用,返回一个相同key对应的所有元素对在一起的(K,(V,W))的RDD,可以使用多种join,如inner join(就是普通的join),outer join(left,right,full),cross join等
  • subtract(otherDataset):取参数RDD在源RDD的补集(做减法),返回一个新RDD
  • intersection(otherDataset):对源RDD和参数RDD求交集后返回一个新的RDD
  • cartesian(otherDataset): 对源RDD和参数RDD每个元素做笛卡尔积,返回一个新RDD

Action

  • reduce(func): 通过func函数聚集RDD中的所有元素,这个功能必须是可交换且可并联的
  • collect(): 在驱动程序中,以数组的形式返回数据集的所有元素
  • count(): 返回RDD的元素个数
  • first(): 返回RDD的第一个元素(类似于take(1))
  • take(n): 返回一个由数据集的前n个元素组成的数组
  • saveAsTextFile(path): 将数据集的元素以textfile的形式保存到HDFS文件系统或者其他支持的文件系统,对于每个元素,Spark将会调用toString方法,将它装换为文件中的文本
  • saveAsSequenceFile(path): 将数据集中的元素以Hadoop sequencefile的格式保存到指定的目录下
  • saveAsObjectFile(path): 将数据集的元素,以 Java 序列化的方式保存到指定的目录下
  • foreach(func): 遍历元素,对每个元素调用函数
  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值