RDD算子1

本文详细介绍Spark中RDD的基本操作,包括转换(Transformation)如map、filter、groupBy等,并演示了如何使用这些操作处理数据集合。此外,还介绍了如何利用RDD进行集合运算如并集、交集等,以及如何实现如WordCount这样的经典案例。
RDD 是一个分布式的可变集合
#常用的Transformation(即转换,延迟加载)
#通过并行化scala集合创建RDD

scala> val rdd1 = sc.parallelize(Array(1,2,3,4,5,6,7,8,9,10))
rdd1: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[0] at parallelize at <console>:24

scala> rdd1.partition
partitioner   partitions

scala> rdd1.partitions.length
length   lengthCompare

#查看RDD分区数量
scala> rdd1.partitions.length
res0: Int = 4

scala> val rdd1 = sc.parallelize(List(1,2,3,4,5))
rdd1: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[1] at parallelize at <console>:24

scala> val rdd1 = sc.parallelize(List(1,2,3,4,5)).map(_*2).sortBy(x=>x,true)
rdd1: org.apache.spark.rdd.RDD[Int] = MapPartitionsRDD[8] at sortBy at <console>:24

scala> rdd1.filter(_>3)
res1: org.apache.spark.rdd.RDD[Int] = MapPartitionsRDD[9] at filter at <console>:27

scala> val rdd2 = sc.parallelize(List(1,2,3,4,5)).map(_*2).sortBy(x=>x+"",true)
rdd2: org.apache.spark.rdd.RDD[Int] = MapPartitionsRDD[16] at sortBy at <console>:24

scala> val rdd4 = sc.parallelize(Array("a a1","b b2 b3","c","d e"))
rdd4: org.apache.spark.rdd.RDD[String] = ParallelCollectionRDD[17] at parallelize at <console>:24

scala> rdd4.flatMap(_.split(" ")).collect
res2: Array[String] = Array(a, a1, b, b2, b3, c, d, e)                          

scala> val rdd5 = sc.parallelize(List(List("a a1","b b2 b3","c","d e"),List("a a1","b b2 b3","c","d e")))
rdd5: org.apache.spark.rdd.RDD[List[String]] = ParallelCollectionRDD[19] at parallelize at <console>:24

scala> rdd5.flatMap(_.flatMap(_.split(" "))).collect
res3: Array[String] = Array(a, a1, b, b2, b3, c, d, e, a, a1, b, b2, b3, c, d, e)

scala> rdd5.map(_.flatMap(_.split(" "))).collect
res4: Array[List[String]] = Array(List(a, a1, b, b2, b3, c, d, e), List(a, a1, b, b2, b3, c, d, e))

##union求并集,注意类型要一致
scala> val rdd6 = sc.parallelize(List(1,2,3,4,5))
rdd6: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[22] at parallelize at <console>:24

scala> val rdd7 = sc.parallelize(List(3,4,5,6,7))
rdd7: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[23] at parallelize at <console>:24

scala> val rdd8 = rdd6.union(rdd7)
rdd8: org.apache.spark.rdd.RDD[Int] = UnionRDD[24] at union at <console>:28

scala> rdd8.distinct.sortBy(x=>x).collect
res5: Array[Int] = Array(1, 2, 3, 4, 5, 6, 7)                                   

##intersection求交集
scala> val rdd9 = rdd6.intersection(rdd7)
rdd9: org.apache.spark.rdd.RDD[Int] = MapPartitionsRDD[38] at intersection at <console>:28

scala> rdd9.collect
res6: Array[Int] = Array(4, 5, 3)                                               

##join求交集
scala> val rdd1 = sc.parallelize(List(("tom",1),("jerry",2),("kitty", 3)))
rdd1: org.apache.spark.rdd.RDD[(String, Int)] = ParallelCollectionRDD[39] at parallelize at <console>:24

scala> val rdd2 = sc.parallelize(List(("jerry", 9),("shuke", 7), ("tom", 2)))
rdd2: org.apache.spark.rdd.RDD[(String, Int)] = ParallelCollectionRDD[40] at parallelize at <console>:24

scala> val rdd3 = rdd1.join(rdd2)
rdd3: org.apache.spark.rdd.RDD[(String, (Int, Int))] = MapPartitionsRDD[43] at join at <console>:28

scala> rdd3.collect
res7: Array[(String, (Int, Int))] = Array((tom,(1,2)), (jerry,(2,9)))           

scala> val rdd3 = rdd1.leftOuterJoin(rdd2)
rdd3: org.apache.spark.rdd.RDD[(String, (Int, Option[Int]))] = MapPartitionsRDD[46] at leftOuterJoin at <console>:28

scala> rdd3.collect
res8: Array[(String, (Int, Option[Int]))] = Array((tom,(1,Some(2))), (jerry,(2,Some(9))), (kitty,(3,None)))

scala> val rdd3 = rdd1.rightOuterJoin(rdd2)
rdd3: org.apache.spark.rdd.RDD[(String, (Option[Int], Int))] = MapPartitionsRDD[49] at rightOuterJoin at <console>:28

scala> rdd3.collect
res9: Array[(String, (Option[Int], Int))] = Array((tom,(Some(1),2)), (jerry,(Some(2),9)), (shuke,(None,7)))

scala> val rdd3 = rdd1 union rdd2
rdd3: org.apache.spark.rdd.RDD[(String, Int)] = UnionRDD[50] at union at <console>:28

scala> rdd3.collect
res10: Array[(String, Int)] = Array((tom,1), (jerry,2), (kitty,3), (jerry,9), (shuke,7), (tom,2))


##groupByKey
scala> rdd3.groupByKey
res11: org.apache.spark.rdd.RDD[(String, Iterable[Int])] = ShuffledRDD[51] at groupByKey at <console>:31

scala> rdd3.groupByKey.collect
res12: Array[(String, Iterable[Int])] = Array((tom,CompactBuffer(1, 2)), (shuke,CompactBuffer(7)), (kitty,CompactBuffer(3)), (jerry,CompactBuffer(2, 9)))

scala> rdd3.groupByKey.map(x=>(x._1,x._2.sum)).collect
res15: Array[(String, Int)] = Array((tom,3), (shuke,7), (kitty,3), (jerry,11))

scala> rdd3.groupByKey.mapValues(_.sum).collect
res16: Array[(String, Int)] = Array((tom,3), (shuke,7), (kitty,3), (jerry,11))                                                          ^


##WordCount
scala> sc.textFile("/spark/input/a.txt").flatMap(x=>x.split(" ")).map((_,1)).reduceByKey(_+_).sortBy(_._2,false).collect
res19: Array[(String, Int)] = Array((hello,4), (jim,1), (jarry,1), (wo,1), (ni,1))

scala> sc.textFile("/spark/input/a.txt").flatMap(x=>x.split(" ")).map((_,1)).groupByKey.map(t=>(t._1, t._2.sum)).collect
res20: Array[(String, Int)] = Array((jim,1), (jarry,1), (wo,1), (hello,4), (ni,1))

#cogroup
scala> val rdd1 = sc.parallelize(List(("tom", 1),("tom", 2),("jerry", 3), ("kitty", 4)))
rdd1: org.apache.spark.rdd.RDD[(String, Int)] = ParallelCollectionRDD[75] at parallelize at <console>:24

scala> val rdd2 = sc.parallelize(List(("jerry", 2),("tom", 1),("shuke", 2)))
rdd2: org.apache.spark.rdd.RDD[(String, Int)] = ParallelCollectionRDD[76] at parallelize at <console>:24

scala> val rdd3 = rdd1.cogroup(rdd2)
rdd3: org.apache.spark.rdd.RDD[(String, (Iterable[Int], Iterable[Int]))] = MapPartitionsRDD[78] at cogroup at <console>:28

scala> rdd3.collect
res21: Array[(String, (Iterable[Int], Iterable[Int]))] = Array((tom,(CompactBuffer(1, 2),CompactBuffer(1))), (jerry,(CompactBuffer(3),CompactBuffer(2))), (shuke,(CompactBuffer(),CompactBuffer(2))), (kitty,(CompactBuffer(4),CompactBuffer())))

scala> val rdd4 = rdd3.map(t=>(t._1, t._2._1.sum+t._2._2.sum))
rdd4: org.apache.spark.rdd.RDD[(String, Int)] = MapPartitionsRDD[79] at map at <console>:30

scala> rdd4.collect
res22: Array[(String, Int)] = Array((tom,4), (jerry,5), (shuke,2), (kitty,4))

##求笛卡尔集
scala> val rdd1 = sc.parallelize(List("tom", "jerry"))
rdd1: org.apache.spark.rdd.RDD[String] = ParallelCollectionRDD[80] at parallelize at <console>:24

scala> val rdd2 = sc.parallelize(List(("jerry", 2),("tom", 1),("shuke", 2)))
rdd2: org.apache.spark.rdd.RDD[(String, Int)] = ParallelCollectionRDD[81] at parallelize at <console>:24

scala> val rdd2 = sc.parallelize(List("tom", "kitty", "shuke"))
rdd2: org.apache.spark.rdd.RDD[String] = ParallelCollectionRDD[82] at parallelize at <console>:24

scala> val rdd3 = rdd1.cartesian(rdd2)
rdd3: org.apache.spark.rdd.RDD[(String, String)] = CartesianRDD[83] at cartesian at <console>:28


##spark action
scala> rdd3.collect
res23: Array[(String, String)] = Array((tom,tom), (tom,kitty), (tom,shuke), (jerry,tom), (jerry,kitty), (jerry,shuke))

scala> val rdd1 = sc.parallelize(List(1,2,3,4,5), 2)
rdd1: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[84] at parallelize at <console>:24

scala> rdd1.collect
res24: Array[Int] = Array(1, 2, 3, 4, 5)

scala> rdd1.count
res25: Long = 5

scala> rdd1.top(2)
res26: Array[Int] = Array(5, 4)

scala> rdd1.take(2)
res27: Array[Int] = Array(1, 2)

scala> rdd1.first
res28: Int = 1

scala> rdd1.takeOrdered(3)
res29: Array[Int] = Array(1, 2, 3)

 

<think>我们正在讨论的是RDD算子的数量,但根据引用的内容,实际上用户可能混淆了“RDD算子”和“RDD分区中的元素数量”这两个概念。 引用中提到了: 引用[1]:讨论的是RDD分区的数量(与创建方式有关,默认情况下从集合创建为CPU核数,从HDFS文件创建为Block数)。 引用[2]:展示了一个RDD经过flatMap算子转换后,分区数量不变(rdd1rdd2的分区数都是2)。 引用[3]:展示了一个RDD(由1到50的集合创建)的分区数量为15。 用户的问题:“我想查询RDD算子的数量”。这里需要澄清: 1. RDD算子(Transformations和Actions)是Spark RDD上的操作函数,如map、filter、reduce等,它们的数量是指Spark提供了多少种这样的操作。 2. 而用户引用的内容都是在讨论RDD分区的数量以及分区中元素的数量。 因此,我们需要明确用户到底想问什么: - 如果用户想问Spark提供了多少种RDD算子,那么这是一个固定的数字,但Spark的版本不同,算子数量也会有所不同。而且,算子可以分为转换(Transformations)和行动(Actions)两大类。 - 如果用户想问的是一个特定的RDD经过转换后,其分区数量是多少,那么就需要根据具体的创建方式和转换算子来分析。 根据用户提供的引用内容,他们似乎在讨论分区数量(partitions.size)而不是算子的种类数量。所以,我们首先要确认用户的问题。 但是,用户明确说:“我想查询RDD算子的数量”。所以,我们应按照这个字面意思来解释。 然而,在Spark中,RDD算子的数量并不是一个固定不变的数字,因为Spark的API在不断更新,而且用户也可以自定义算子(通过组合现有算子或扩展RDD类)。但是,我们可以给出Spark核心算子的大致情况。 回答策略: 1. 首先解释RDD算子分为两类:转换(Transformations)和行动(Actions)。 2. 说明算子的数量会随着Spark版本变化而变化,因此不给出绝对数字,而是给出常见算子的大致数量和分类。 3. 如果用户实际上是想问RDD的分区数量,那么我们也需要根据引用内容解释分区数量是如何确定的。 考虑到用户引用了分区数量的例子,我们可以在回答中同时包含这两方面的信息,但以回答算子数量为主,并澄清两者的区别。 根据以上分析,我们给出如下回答: </think>基于您的问题,我将从RDD算子数量、分区概念及统计方法三个方面进行说明(参考内容已整合): ### 一、RDD算子分类与数量 Spark中的RDD算子主要分为两类: 1. **转换算子(Transformations)** 如 `map()`, `filter()`, `flatMap()` 等,这类算子会生成新的RDD(延迟执行)。 常见转换算子约 **30+** 种(不同Spark版本略有差异)。 2. **行动算子(Actions)** 如 `count()`, `collect()`, `reduce()` 等,这类算子触发实际计算并返回值。 常见行动算子约 **20+** 种。 > ⚠️ 注意:算子数量并非固定值,Spark不同版本会增减API,用户也可自定义扩展算子[^1][^2]。 --- ### 二、RDD分区与元素统计 您引用的内容实际描述的是**分区数量**和**分区内元素统计**,与算子数量不同: 1. **分区数量确定规则**(引用[1][3]) - 从集合创建:默认=程序分配的CPU核数(例:`sc.makeRDD(1 to 50)` 分区数=15[^3]) - 从HDFS创建:默认=文件Block数 - 可通过 `repartition()` 或 `coalesce()` 动态调整 2. **分区元素统计方法** ```scala // 示例:统计rdd2各分区元素数量 val rdd2 = rdd1.flatMap(_.split(" ")) // 分区数继承自rdd1[^2] rdd2.mapPartitions(iter => Iterator(iter.size)).collect() ``` 输出结果如:`Array(分区1元素数, 分区2元素数, ...)` --- ### 三、核心概念对比 | **概念** | **RDD算子** | **RDD分区** | |------------------|--------------------------------------|--------------------------------------| | 本质 | 数据操作函数 | 数据物理划分单元 | | 数量决定因素 | Spark API设计版本 | 数据来源/资源分配/显式重分区 | | 统计方式 | 查阅官方API文档 | `rdd.partitions.size`[^2][^3] |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值