Spark 十大常用的 RDD API (适合小白)

本文介绍了Spark中的核心数据结构RDD,包括如何创建、转换和操作RDD。通过实例解析了map、filter、flatMap、union、intersection、distinct、subtract、sortBy、groupBy、groupByKey、reduceByKey、sortByKey、join、reduce和foreach等关键API的用法,适合初学者掌握Spark编程基础。

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

0. RDD是什么?

RDD是Spark中的抽象数据结构类型,任何数据在Spark中都被表示为RDD。从编程的角度来看,RDD可以简单看成是一个数组。和普通数组的区别是,RDD中的数据是分区存储的,这样不同分区的数据就可以分布在不同的机器上,同时可以被并行处理。因此,Spark应用程序所做的无非是把需要处理的数据转换为RDD,然后对RDD进行一系列的变换和操作从而得到结果。

1.创建RDD(主要使用以下两种方式来创建RDD)

方式1:从普通数组(List和Array)创建RDD

collect() 返回RDD所有元素

scala> val a =sc.parallelize(1 to 9,3)
/*里面包含了1到9这9个数字,它们分别在3个分区中。*/
a: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[1] at parallelize at <console>:24

/* List */

scala>val rdd01 = sc.makeRDD(List(1,2,3,4,5,6))
val r01 = rdd01.map { x => x * x }
println(r01.collect().mkString(","))
1,4,9,16,25,36

/* Array */

val rdd02 = sc.makeRDD(Array(1,2,3,4,5,6))
val r02 = rdd02.filter { x => x < 5}
println(r02.collect().mkString(","))
1,2,3,4

方式2:读取文件README.md来创建RDD,文件中的每一行就是RDD中的一个元素

scala> val b = sc.textFile("README.md")
b: org.apache.spark.rdd.RDD[String] = README.md MapPartitionsRDD[5] at textFile at <console>:2

2 .map和filter

map:参数是函数,函数应用于RDD每一个元素,返回值是新的RDD。换句话说是对RDD中的每个元素都执行一个指定的函数来产生一个新的RDD。任何原RDD中的元素在新RDD中都有且只有一个元素与之对应。

filter:参数是函数,函数会过滤掉不符合条件的元素,返回值是新的RDD。

eg1:对a里的每个元素乘以2,然后排序

scala> val a = sc.parallelize(List(1,2,3,4,5))
scala> val b = a.map(_*3).collect
b: Array[Int] = Array(3, 6, 9, 12, 15)

/*true是升序排序,false是降序排序*/
scala> val c = a.map(_*2).sortBy(x =>x,true).collect
c: Array[Int] = Array(2, 4, 6, 8, 10)
scala> val d = a.map(_*2).sortBy(x =>x,false).collect
d: Array[Int] = Array(10, 8, 6, 4, 2)

ex2:过滤出大于20的数和偶数

scala> val a = sc.parallelize(List(1,22,100,5,56)).filter(_>20).collect
a: Array[Int] = Array(22, 100, 56)

scala> val a = sc.parallelize(List(1,22,100,5,55)).filter(_%2==0).collect
a: Array[Int] = Array(22, 100)

3 .map和flatMap

与map类似,区别是原RDD中的元素经map处理后只能生成一个元素,而原RDD中的元素经flatmap处理后可生成多个元素来构建新RDD。

eg3:仔细感受map和flatMap的区别

scala> val a = sc.parallelize(Array("china","is","Strong"))
a: org.apache.spark.rdd.RDD[String] = ParallelCollectionRDD[35] at parallelize at <console>:24

/* map */

scala> a.map(_.split(" ")).collect
res3: Array[Array[String]] = Array(Array(china), Array(is), Array(Strong))

/* flatMap 分开并压平了*/

scala> val a = sc.parallelize(Array("china","is","Strong")).flatMap(_.split(" ")).collect
a: Array[
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值