【Spark】(二)spark RDD知识点

本文深入探讨了Spark的RDD(弹性分布式数据集)概念,包括其分布式、弹性和容错性的特性。介绍了RDD的创建方法,如内存集合、文件加载和其他高级方式。详细讲解了RDD的编程流程,转换算子如map、filter和reduceByKey,以及动作算子如count、collect和saveAsTextFile。此外,还讨论了RDD分区和操作的执行过程。
摘要由CSDN通过智能技术生成

Spark RDD概念

  • 1、简单的解释
    RDD是将数据项拆分为多个分区的集合,存储在集群的工作节点上的内存中,并执行正确的操作
  • 2、复杂的解释
    RDD是用于数据转换的接口
    RDD指向了存储在HDFS、Cassandra、HBase等、或缓存(内存、内存+磁盘、仅磁盘等),或在故障或缓存收回时重新计算其他RDD分区中的数据
  • 3、RDD是弹性分布式数据集(Resilient Distributed Datasets)
    a)分布式数据集
    RDD是只读的、分区记录的集合,每个分区分布在集群的不同节点上
    RDD并不存储真正的数据,只是对数据和操作的描述
    b)弹性
    RDD默认存放在内存中,当内存不足,Spark自动将RDD写入磁盘
    c)容错性
    根据数据血统,可以自动从节点失败中恢复分区

RDD与DAG对比

1、两者是Spark提供的核心抽象
2、DAG(有向无环图)反映了RDD之间的依赖关系
在这里插入图片描述

RDD的特性

1、一系列的分区(分片)信息,每个任务处理一个分区
2、每个分区上都有compute函数,计算该分区中的数据
3、RDD之间有一系列的依赖
4、分区函数决定数据(key-value)分配至哪个分区
5、最佳位置列表,将计算任务分派到其所在处理数据块的存储位置

RDD编程流程

在这里插入图片描述

RDD的创建

一、使用内存集合创建RDD

在这里插入图片描述
注意:
1、Spark默认会根据集群的情况来设置分区的数量,也可以通过parallelize()第二参数来指定
2、Spark会为每一个分区运行一个任务进行处理

二、通过加载文件产生RDD

1、加载本地文件
在这里插入图片描述
注意:加载“file://……”时,以local运行仅需一份本地文件,以Spark集群方式运行,应保证每个节点均有该文件的本地副本

2、加载HDFS文件
在这里插入图片描述

注:支持目录、压缩文件以及通配符
在这里插入图片描述
在这里插入图片描述

三、其他创建RDD的方法

  • 1、SparkContext.wholeTextFiles():可以针对一个目录中的大量小文件返回<filename,fileContent>作为PairRDD
    a)普通RDD:org.apache.spark.rdd.RDD[data_type]
    b)PairRDD:org.apache.spark.rdd.RDD[(key_type,value_type)]
    注意:Spark 为包含键值对类型的 RDD 提供了一些专有的操作,比如:reduceByKey()、groupByKey()……也可以通过键值对集合创建PairRDD: sc.parallelize(List((1,2),(1,3))

  • 2、SparkContext.sequenceFileK,V
    Hadoop SequenceFile的读写支持

  • 3、SparkContext.hadoopRDD()、newAPIHadoopRDD()
    从Hadoop接口API创建

  • 4、SparkContext.objectFile()
    RDD.saveAsObjectFile()的逆操作

RDD创建方式的最佳实战

  • 1、测试环境
    使用内存集合创建RDD
    使用本地文件创建RDD
  • 2、生产环境
    使用HDFS文件创建RDD

RDD分区

分区是RDD被拆分并发送到节点的不同块之一

  • 我们拥有的分区越多,得到的并行性就越强
  • 每个分区都是被分发到不同Worker Node的候选者
  • 每个分区对应一个Task
    在这里插入图片描述

RDD的操作

分为lazy与non-lazy两种

  • 1、Transformation(lazy):也称转换操作、转换算子
  • 2、Actions(non-lazy):立即执行,也称动作操作、动作算子

RDD转换算子

对于转换操作,RDD的所有转换都不会直接计算结果

  • 1、仅记录作用于RDD上的操作
  • 2、当遇到动作算子(Action)时才会进行真正计算

RDD常用的转换算子

map

1、对RDD中的每个元素都执行一个指定的函数来产生一个新的RDD
2、任何原RDD中的元素在新的RDD中都有且只有一个元素与之对应
3、输入分区与输出分区一一对应

def main(args: Array[String]): Unit = {
   
  val conf: SparkConf = new SparkConf().setMaster("local[2]").setAppName("mapdemo")
  val sc: SparkContext = SparkContext.getOrCreate(conf)
  val rdd1: RDD[Int] = sc.makeRDD(1 to 9,3)
  val rdd2: RDD[Int] = rdd1.map(_*2)
  rdd2.collect.foreach(println)

  println("-------------------------------------")
  val strRdd1 = sc.parallelize(List("kb02","kb05","kb07","kb09","spark","study"),2)
  val strRdd2: RDD[(String,Int)] = strRdd1.map(x=>(x,1))
  strRdd2.collect.foreach(println)
}

在这里插入图片描述

filter

对元素进行过滤,对每个元素应用指定函数,返回值为true的元素保留在新的RDD中

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值