SPARK笔记 (二) RDD的使用

本文详细介绍了Spark中的Resilient Distributed Dataset(RDD),包括其不可变、分布式的特点,以及Transformation和Action两类算子。重点讨论了如map、filter、reduceByKey、collect等常用算子的用法,并提到了RDD的缓存和检查点策略,旨在帮助理解RDD的使用和优化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. RDD的使用

    1. 1什么是RDD

        RDD的全称为Resilient Distributed Dataset,是一个弹性、可复原的分布式数据集,是Spark中最基本的抽象,是一个不可变的、有多个分区的、可以并行计算的集合。RDD中并不装真正要计算的数据,而装的是描述信息,描述以后从哪里读取数据,调用了用什么方法,传入了什么函数,以及依赖关系等。

 

1.2RDD的特点

  1.  有一些列连续的分区:分区编号从0开始,分区的数量决定了对应阶段Task的并行度
  2.  有一个函数作用在每个输入切片上: 每一个分区都会生成一个Task,对该分区的数据进行计算,整函数就是具体的计算逻辑
  3.  RDD和RDD之间存在一些列依赖关系:RDD调用Transformation后会生成一个新的RDD,子RDD会记录父RDD的依赖关   系,包括宽依赖(有shuffle)和窄依赖(没有shuffle)
  4. (可选的)K-V的RDD在Shuffle会有分区器,默认使用HashPartitioner
  5. (可选的)如果从HDFS中读取数据,会有一个最优位置:spark在调度任务之前会读取NameNode的元数据信息,获取数据的位置,移动计算而不是移动数据,这样可以提高计算效率。

 

1.3RDD的算子分类

     1.Transformation:即转换算子,调用转换算子会生成一个新的RDD,Transformation是Lazy的,不会触发job执行。

     2. Action:行动算子,调用行动算子会触发job执行,本质上是调用了sc.runJob方法,该方法从最后一个RDD,根据其依赖关系,从后往前,划分Stage,生成TaskSet。

1.3.1创建RDD的方法

  1. 通过并行化方式,将Driver端的集合转成RDD
val rdd1: RDD[Int] = sc.parallelize(Array(1,2,3,4,5,6,7,8))

     2.从HDFS指定的目录据创建RDD

val lines: RDD[String] = sc.textFile("hdfs://node-1.51doit.cn:9000/log")

注意,使用上面两种方式创建RDD都可以指定分区的数量

 1.3.2查看RDD的数量

val rdd1: RDD[Int] = sc.parallelize(Array(1,2,3,4,5,6,7,8))
rdd1.partitions.length

1.3.3RDD常用的Transformation算子

     1.map算子,功能所做映射

val rdd1: RDD[Int] = sc.parallelize(List(5,6,4,7,3,8,2,9,1,10)).map(_*2)

     2.flatMap算子,先map在压平,spark中没有flatten方法

val rdd2 = sc.parallelize(Array("a b c", "d e f", "h i j"))

rdd2.flatMap(_.split(' ')).collect

  val rdd3 = sc.parallelize(List(List("a b c", "a b b"),List("e f g", "a f g")))

rdd3.flatMap(_.flatMap(_.split(" "))).collect

   3.filter算子,功能为过滤数据

val rdd4 = sc.parallelize(List(5,6,4,7,3,8,2,9,1,10)).filter(_ % 2 == 0)

   4.mapPartitions,将数据以分区为的形式返回进行map操作,一个分区对应一个迭代器,该方法和map方法类似,只不过该方法的参数由RDD中的每一个元素变成了RDD中每一个分区的迭代器,如果在映射的过程中需要频繁创建额外的对象,使用mapPartitions要比map高效的过。


val rdd1 = sc.parallelize(List(1, 2, 3, 4, 5),2)

val r1: RDD[Int] =rdd1.map(x=>x)
var r2: RDD[Int] = rdd1.mapPartitions(it => it.map(x => x * 10))

   5.mapPartitionsWithIndex,类似于mapPartitions, 不过函数要输入两个参数,第一个参数为分区的索引,第二个是对应分区的迭代器。函数的返回的是一个经过该函数转换的迭代器。

 val conf = new SparkConf().setAppName("TransformationDemo")
    val sc: SparkContext = new SparkContext(conf)
    val arr: RDD[Int] = sc.parallelize(Array(3, 7, 5, 8, 2, 3, 7, 4, 5),2)
    arr.mapPartitionsWithIndex((in
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值