Spark RDD常见转换和动作

本文深入解析了Spark中RDD的基本操作,包括转换算子如filter、map等,以及Action算子如count、collect等,详细阐述了这些操作如何帮助数据处理和分析。

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

Spark在提交后通过数据输入形成RDD,然后就可以通过转换算子(如filter,map)对数据进行操作并将RDD转换为新的RDD,然后通过action算子,出发Spark提交作业

转换操作:
  • 转换操作有值类型的和键值(key/value)类型的转换,两者都不会触发提交作业
  • map:最常见的操作即将rdd中每个数据想通过用户自定函数映射成新的元素,如rdd1:RDD[Int],rdd1.map(f=>(f,f*f))
  • flatMap(func):类似于map,但每一个输入元素可以被映射成为一个或多个输出元素
  • filter(func):返回一个经过过滤后的新数据集,过滤方式为func自定义的任意类型,对于每个项进行操作,返回true的数据项进行保留,新的数据集为上一个的子集
  • mapPartitions:获取每个分区的迭代器,在函数中通过这个分区的整体迭代器对整个分区的元素进行操作
  • union:合并两个相同类型的rdd,并且不进行去重操作,类似于sql的中union,由于没有union all操作,如果要去重的话可以使用rdd.distinct,rdd1++rdd2相当于union操作
  • subtract:相当于两个rdd进行差集的操作,如rdd1.subtract(rdd2),相当于去除rdd1中所有不存在rdd2中的元素,有点类似not in操作
  • filter(f):过滤用的,过滤符合f函数或表达式为true的数据出来
  • distinct();返回一个去重后的新的Rdd
  • groupByKey():返回聚合之后Key-Value集合Dataset,例如{[1,2],[1,3],[2,4],[2,4]},groupByKey之后{[1,[2,3]],[2,[4,4]]}
Action操作
  • reduce(f):将Rdd聚集,使用指定的可交换和关联的二进制运算符减少此RDD的元素。
  • collect():返回Rdd中所有的集合,量大的谨慎使用
  • count() :获取RDD集合中元素个数
  • first():返回第一个元素
  • take(n):获取rdd中前N个元素
  • foreach(f):将函数f应用于此RDD的所有元素
  • saveAsTextFile(path: String, codec: Class[_ <: CompressionCodec]):将Rdd存储为text 文件,一般在hdfs中,rdd中每个元素为一行
### Spark RDD 转换算子的使用方法及示例 #### 什么是转换算子? 在Spark中,RDD(弹性分布式数据集)支持两种主要的操作:**转换操作****动作操作**。转换操作是对现有RDD执行的一种操作,返回一个新的RDD。这些操作不会立即触发计算,而是构建一个逻辑计划来描述如何从其他已有的RDD派生新的RDD[^1]。 #### 常见转换算子及其功能 以下是几个常见转换算子以及它们的功能: 1. **map(func)** 对RDD中的每一个元素应用函数`func`并返回一个新的RDD。 2. **filter(func)** 返回一个新的RDD,其中只包含满足条件`func(x)`为真的元素。 3. **flatMap(func)** 类似于`map`,但是可以将每个输入项映射到多个输出项。 4. **union(otherDataset)** 返回两个RDD的并集,即包含两个RDD中所有元素的新RDD[^2]。 5. **join(otherDataset, numPartitions)** 执行两组键值对RDD之间的内连接操作。 6. **groupByKey([numTasks])** 当处理由(key, value)组成的RDD时,此操作会针对每个key聚合所有的value。 7. **reduceByKey(func, [numTasks])** 针对具有相同key的所有values调用指定的二元运算符`func`,从而减少该key对应的values数量。 8. **sortByKey(ascending=True, numPartitions=None)** 按照key排序,可以选择升序或者降序排列。 9. **distinct([numTasks])** 删除重复的数据条目,保留唯一的结果集合。 --- #### 示例代码展示 下面是一些具体的例子,展示了上述提到的一些常用转换算子的实际运用方式。 ##### map() 示例 ```python rdd = sc.parallelize([1, 2, 3, 4]) mapped_rdd = rdd.map(lambda x: x * 2) print(mapped_rdd.collect()) # 输出: [2, 4, 6, 8] ``` ##### filter() 示例 ```python filtered_rdd = rdd.filter(lambda x: x % 2 == 0) print(filtered_rdd.collect()) # 输出: [2, 4] ``` ##### flatMap() 示例 ```python words_list = ["hello world", "spark is great"] rdd_words = sc.parallelize(words_list) flattened_rdd = rdd_words.flatMap(lambda line: line.split(" ")) print(flattened_rdd.collect()) # 输出: ['hello', 'world', 'spark', 'is', 'great'] ``` ##### union() 示例 ```python rdd1 = sc.parallelize([1, 2, 3]) rdd2 = sc.parallelize([4, 5, 6]) united_rdd = rdd1.union(rdd2) print(united_rdd.collect()) # 输出: [1, 2, 3, 4, 5, 6] ``` ##### reduceByKey() 示例 ```python pairs = sc.parallelize([('a', 1), ('b', 1), ('a', 1)]) reduced_pairs = pairs.reduceByKey(lambda a, b: a + b) print(reduced_pairs.collect()) # 输出: [('a', 2), ('b', 1)] ``` --- ### 总结 通过以上介绍可以看出,Spark RDD转换算子提供了强大的工具用于数据变换准备阶段的工作。每种转换都有其特定用途,在实际开发过程中可以根据需求灵活选用不同的转换算子组合实现复杂业务逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值