Spark32个常用算子总结

官方文档上列举共有32种常见算子,包括Transformation的20种操作和Action的12种操作。

(注:以下截图为windows下运行结果)

Transformation:

1.map

map的输入变换函数应用于RDD中所有元素,而mapPartitions应用于所有分区。区别于mapPartitions主要在于调用粒度不同。如parallelize(1 to 10, 3),map函数执行10次,而mapPartitions函数执行3次。

2.filter(function)

过滤操作,满足filter内function函数为true的RDD内所有元素组成一个新的数据集。如:filter(a == 1)。

3.flatMap(function)

map是对RDD中元素逐一进行函数操作映射为另外一个RDD,而flatMap操作是将函数应用于RDD之中的每一个元素,将返回的迭代器的所有内容构成新的RDD。而flatMap操作是将函数应用于RDD中每一个元素,将返回的迭代器的所有内容构成RDD。

flatMap与map区别在于map为“映射”,而flatMap“先映射,后扁平化”,map对每一次(func)都产生一个元素,返回一个对象,而flatMap多一步就是将所有对象合并为一个对象。

4.mapPartitions(function)

区于foreachPartition(属于Action,且无返回值),而mapPartitions可获取返回值。与map的区别前面已经提到过了,但由于单独运行于RDD的每个分区上(block),所以在一个类型为T的RDD上运行时,(function)必须是Iterator<T> => Iterator<U>类型的方法(入参)。

5.mapPartitionsWithIndex(function)

与mapPartitions类似,但需要提供一个表示分区索引值的整型值作为参数,因此function必须是(int, Iterator<T>)=>Iterator<U>类型的。

6.sample(withReplacement, fraction, seed)

采样操作,用于从样本中取出部分数据。withReplacement是否放回,fraction采样比例,seed用于指定的随机数生成器的种子。(是否放回抽样分true和false,fraction取样比例为(0, 1]。seed种子为整型实数。)

### Spark算子概述 Spark 是一种分布式计算框架,其核心概念之一是 **RDD(弹性分布式数据集)**。通过一系列的转换操作(Transformation),可以构建复杂的并行计算流程。最终可以通过行动操作(Action)触发实际的任务执行。 以下是常见的 Spark 算子分类及其使用方法: --- #### 转换算子Transformation) ##### `map` 将输入中的每一个元素应用指定函数,并返回一个新的 RDD。 ```python rdd = sc.parallelize([1, 2, 3]) mapped_rdd = rdd.map(lambda x: x * 2) print(mapped_rdd.collect()) # 输出: [2, 4, 6] ``` ##### `filter` 过滤掉不满足条件的数据项。 ```python filtered_rdd = rdd.filter(lambda x: x % 2 == 0) print(filtered_rdd.collect()) # 输出: [2] ``` ##### `flatMap` 类似于 map,但是会将结果扁平化处理。 ```python words = ["hello world", "this is a test"] flat_mapped_rdd = sc.parallelize(words).flatMap(lambda line: line.split()) print(flat_mapped_rdd.collect()) # 输出: ['hello', 'world', 'this', 'is', 'a', 'test'] ``` ##### `repartition` 重新分配分区数量,可能引发 Shuffle 操作。 ```python rep_rdd = rdd.repartition(4) # 将分区数调整为4 print(rep_rdd.getNumPartitions()) # 输出: 4 ``` 此过程涉及 Shuffle 的实现细节可参见[^3]。 --- #### 行动算子Action) ##### `reduce` 对 RDD 中的所有元素进行两两聚合运算。 ```python sum_result = rdd.reduce(lambda x, y: x + y) print(sum_result) # 输出: 7 ``` ##### `collect` 将整个 RDD 收集到驱动程序中作为列表返回。 ```python collected_data = rdd.collect() print(collected_data) # 输出: [1, 2, 3] ``` ##### `count` 统计 RDD 中的元素总数。 ```python cnt = rdd.count() print(cnt) # 输出: 3 ``` ##### `take` 获取前 N 个元素。 ```python taken_elements = rdd.take(2) print(taken_elements) # 输出: [1, 2] ``` --- #### Join 类型算子 ##### `join` 和 `leftOuterJoin` 用于两个键值对类型的 RDD 进行连接操作。 ```python rdd1 = sc.parallelize([(1, "Apple"), (2, "Banana")]) rdd2 = sc.parallelize([(2, "Yellow"), (3, "Red")]) joined_rdd = rdd1.join(rdd2) print(joined_rdd.collect()) # 输出 [(2, ('Banana', 'Yellow'))] outer_joined_rdd = rdd1.leftOuterJoin(rdd2) print(outer_joined_rdd.collect()) # 结果示例可见于[^4] ``` --- #### 自定义算子 在 Java 或 Scala 中自定义算子时,通常需要继承特定接口并重写方法。例如,在 Java 中实现 Filter 功能: ```java JavaRDD<String> filteredRdd = rdd.filter(new Function<String, Boolean>() { public Boolean call(String row) throws Exception { return !row.isEmpty(); // 只保留非空字符串 } }); ``` 上述逻辑也可扩展至其他复杂场景下,具体实现方式详见[^2]。 --- ### 总结 以上展示了部分常用Spark 算子以及它们的应用实例。每种算子都有独特的用途和性能特点,合理选择能够显著提升作业效率。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值