Spark中rdd的介绍,创建及常用算子

目录

 

1.RDD简述

2.Rdd的创建

2.1集合并行化

2.2读取外部文件系统

2.3调用转换类的算子

3.Rdd的算子

3.1.Transformation

3.1.1.map

3.1.3.mapPartitions

3.1.4.mapPartitionsWithIndex

3.1.5.flatMap

3.1.6.filter

3.1.7.groupBy,groupByKey,reduceByKey

3.1.8.sortBy和sortByKey

3.1.9union,intersection,subtract

3.2.action

3.2.1.foreach

3.2.2.foreachPartition

3.2.3常用的action算子

3.2.4.collect,collectAsMap


1.RDD简述

RDD是spark中的基本的抽象的计算模型。

RDD( Resilient Distributed Dataset) 弹性分布式的数据集

弹性: 容错的概念。

分布式: 分区的概念。不同的分区中的数据,可能运行在不同机器上。

数据集合: 存储数据。

不可变,只读的,被分区的数据集。

类似于scala的本地集合,有很多的方法可以调用。操作起来和本地集合一样。

RDD还有5大特性。

2.Rdd的创建

创建rdd有3种方式:

2.1集合并行化

该方法是将本地集合(Seq)转化成rdd,多用于测试时使用

 

scala> val arr = Array(List(1,3),List(4,6))

arr: Array[List[Int]] = Array(List(1, 3), List(4, 6))

 

scala> val rdd2 = sc.makeRDD(arr)

rdd2: org.apache.spark.rdd.RDD[List[Int]] = ParallelCollectionRDD[2] at makeRDD at <console>:26

scala> val rdd3 = sc.parallelize(arr)

2.2读取外部文件系统

这是实际中最常用的方法,可以读hdfs文件,也可以读取本地文件

sc.textFile(“”)

2.3调用转换类的算子

只要调用transformation类的算子,都会生成一个新的RDD

 RDD中的数据类型,由传入给算子的函数的返回值类型决定

val file: RDD[String] = sc.textFile(input)
val map: RDD[Array[String]] = file.map(_.split(" "))
// 切分并压平
val words: RDD[String] = file.flatMap(_.split(" "))

强调: action类的算子,不会生成rdd。

3.Rdd的算子

rdd的算子主要分为两大类,transformation和action

其中,转换类的算子transformation会生成新的rdd,是lazy执行的,只有遇到ac才能被执行

行动类的算子action会立即触发任务的执行,不会生成rdd

3.1.Transformation

3.1.1.map

map是一一映射,对某一个rdd执行map,rdd有几条数据,就会被迭代执行几次

map的返回值的数据类型,取决于传递的函数的返回值类型

rdd的分区数量,是不变的

 

scala> val rdd1 = sc.makeRDD(List(1,4,2,5,7,8),3)

rdd1: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[0] at makeRDD at <console>:24

 

scala> val rdd2  = rdd1.map(_>5)

rdd2: org.apache.spark.rdd.RDD[Boolean] = MapPartitionsRDD[1] at map at <console>:26

 

scala> rdd2.collect

[Stage 0:>                                                          (0 + 0) /                                                                               res1: Array[Boolean] = Array(false, false, false, false, true, true)

 

scala> rdd1.partitions.size

res2: Int = 3

 

scala> rdd2.partitions.size

res3: Int = 3

类似于map,作用于RDD[k,v]中的v。key保持不变

mapValues得到的rdd的分区数量是不变的

 

scala> val rdd = sc.makeRDD(List(("reba",100),("fengjie",80)))

rdd: org.apache.spark.rdd.RDD[(String, Int)] = ParallelCollectionRDD[2] at makeRDD at <console>:24

 

scala> rdd.mapValues(_*100)

res4: org.apache.spark.rdd.RDD[(String, Int)] = MapPartitionsRDD[3] at mapValues at <console>:27

scala> val rdd3  = rdd.mapValues(((t:Int)=> t*100))

rdd3: org.apache.spark.rdd.RDD[(String, Int)] = MapPartitionsRDD[4] at mapValues at <console>:26

 

scala> rdd3.collect

res5: Array[(String, Int)] = Array((reba,10000), (fengjie,8000))

3.1.3.mapPartitions

作用于每一个rdd的分区

传递的函数是一个迭代器

有几个分区,就会迭代几次

val conf =new SparkConf()
.setMaster(
"local[*]")
.setAppName(
this.getClass.getSimpleName)
val sc = new SparkContext(conf)

val rdd1 = sc.makeRDD(List

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值