spark常用算子(函数)

本文详细介绍了Spark中的Transformations转换算子,包括filter、map、flatMap、sample、reduceByKey、sortByKey/sortBy等,并阐述了Action行动算子如count、take、first、foreach和collect的作用。同时,讨论了控制算子cache、persist和checkpoint的功能和使用注意事项,特别是它们在数据持久化和优化计算流程中的角色。

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

 

一、spark常用算子

1、Transformations转换算子

    1.概念:

       Transformations类算子是一类算子(函数)叫做转换算子,如map,flatMap,reduceByKey等。Transformations算子是延迟执行,也叫懒加载执行。

    2.Transformation类算子:

  • filter

过滤符合条件的记录数,true保留,false过滤掉。

  • map

将一个RDD中的每个数据项,通过map中的函数映射变为一个新的元素。

特点:输入一条,输出一条数据。

  • flatMap

先map后flat。与map类似,每个输入项可以映射为0到多个输出项。

  • sample

随机抽样算子,根据传进去的小数按比例进行又放回或者无放回的抽样。

  • reduceByKey

将相同的Key根据相应的逻辑进行处理。

  • sortByKey/sortBy

作用在K,V格式的RDD上,对key进行升序或者降序排序。

2、Action行动算子

  1. 概念:

Action类算子也是一类算子(函数)叫做行动算子,如foreach,collect,count等。Transformations类算子是延迟执行,Action类算子是触发执行。一个application应用程序中有几个Action类算子执行,就有几个job运行。

     2.Action类算子

  • count

返回数据集中的元素数。会在结果计算完成后回收到Driver端。

  • take(n)

返回一个包含数据集前n个元素的集合。

  • first

first=take(1),返回数据集中的第一个元素。

  • foreach

循环遍历数据集中的每个元素,运行相应的逻辑。

  • collect

将计算结果回收到Driver端。

3、控制算子

      概念:控制算子有三种,cache,persist,checkpoint,以上算子都可以将RDD持久化,持久化的单位是partition。cache和persist都是懒执行的。必须有一个action类算子触发执行。checkpoint算子不仅能将RDD持久化到磁盘,还能切断RDD之间的依赖关系。

  1. cache

默认将RDD的数据持久化到内存中。cache是懒执行。

  • 注意:chche () = persist()=persist(StorageLevel.Memory_Only)
  • 测试cache文件:

这里需要一个大一点文件200M即可

测试代码:

 SparkConf conf = new SparkConf();
 conf.setMaster("local").setAppName("CacheTest");
 JavaSparkContext jsc = new JavaSparkContext(conf);
 JavaRDD<String> lines = jsc.textFile("./filename");

 lines = lines.cache();
 long startTime = System.currentTimeMillis();
 long count = lines.count();
 long endTime = System.currentTimeMillis();
 System.out.println("共"+count+ "条数据,"+"初始化时间+cache时间+计算时间="+ 
          (endTime-startTime));
		
 long countStartTime = System.currentTimeMillis();
 long countrResult = lines.count();
 long countEndTime = System.currentTimeMillis();
 System.out.println("共"+countrResult+ "条数据,"+"计算时间="+ (countEndTime-
           countStartTime));
		
 jsc.stop();

    2.persist

可以指定持久化的级别。最常用的是MEMORY_ONLY和MEMORY_AND_DISK。”_2”表示有副本数。

  • cache和persist的注意事项:
  1. cache和persist都是懒执行,必须有一个action类算子触发执行。
  2. cache和persist算子的返回值可以赋值给一个变量,在其他job中直接使用这个变量就是使用持久化的数据了。持久化的单位是partition。
  3. cache和persist算子后不能立即紧跟action算子。
  4. cache和persist算子持久化的数据当applilcation执行完成之后会被清除。

错误:rdd.cache().count() 返回的不是持久化的RDD,而是一个数值了。

 

     3.checkpoint

checkpoint将RDD持久化到磁盘,还可以切断RDD之间的依赖关系。checkpoint目录数据当application执行完之后不会被清除。

  • checkpoint 的执行原理:
  1. 当RDD的job执行完毕后,会从finalRDD从后往前回溯。
  2. 当回溯到某一个RDD调用了checkpoint方法,会对当前的RDD做一个标记。
  3. Spark框架会自动启动一个新的job,重新计算这个RDD的数据,将数据持久化到HDFS上。
  • 优化:对RDD执行checkpoint之前,最好对这个RDD先执行cache,这样新启动的job只需要将内存中的数据拷贝到HDFS上就可以,省去了重新计算这一步。
  • 使用:
 SparkConf conf = new SparkConf();
 conf.setMaster("local").setAppName("checkpoint");
 JavaSparkContext sc = new JavaSparkContext(conf);
 sc.setCheckpointDir("./checkpoint");
 JavaRDD<Integer> parallelize = sc.parallelize(Arrays.asList(1,2,3));
 parallelize.checkpoint();
 parallelize.count();
 sc.stop();

 

### 三、Spark常用算子介绍及使用场景 Apache Spark 提供了丰富的算子(Operator),用于实现数据的转换和处理。这些算子可以分为两类:**转换算子(Transformation)** 和 **行动算子(Action)**。转换算子是惰性执行的,只有遇到行动算子才会真正触发任务的执行。Spark算子数量远多于 MapReduce,具备更强的表达力和灵活性,能够满足大多数大数据处理场景的需求[^1]。 --- #### 3.1 转换算子(Transformation) 转换算子用于将一个 RDD 转换为另一个 RDD,其执行是惰性的。 ##### 3.1.1 `map` `map` 算子用于对 RDD 中的每个元素应用一个函数,并返回新的 RDD。它是一对一的映射关系。 ```scala val rdd = sc.parallelize(Seq(1, 2, 3, 4)) val mappedRdd = rdd.map(x => x * 2) ``` ##### 3.1.2 `filter` `filter` 算子用于筛选出满足条件的元素,生成新的 RDD。 ```scala val filteredRdd = rdd.filter(x => x % 2 == 0) ``` ##### 3.1.3 `flatMap` `flatMap` 与 `map` 类似,但每个输入元素可以映射为多个输出元素,最终结果是扁平化的 RDD。 ```scala val flatMappedRdd = rdd.flatMap(x => Seq(x, x * 2)) ``` ##### 3.1.4 `union` `union` 算子用于合并两个具有相同数据类型的 RDD,不进行去重操作。 ```scala val rdd1 = sc.parallelize(Seq(1, 2, 3)) val rdd2 = sc.parallelize(Seq(3, 4, 5)) val unionRdd = rdd1.union(rdd2) // 结果包含 1,2,3,3,4,5 ``` ##### 3.1.5 `distinct` `distinct` 算子用于去除 RDD 中的重复元素。 ```scala val distinctRdd = unionRdd.distinct() ``` ##### 3.1.6 `join` `join` 算子用于对两个键值对 RDD 进行连接操作,返回键相同的所有键值对组合。 ```scala val rdd1 = sc.parallelize(Seq(("a", 1), ("b", 2))) val rdd2 = sc.parallelize(Seq(("a", 3), ("b", 4))) val joinedRdd = rdd1.join(rdd2) // 结果为 ("a", (1,3)), ("b", (2,4)) ``` ##### 3.1.7 `groupByKey` `groupByKey` 算子用于将键值对 RDD 中相同键的值进行分组。 ```scala val groupedRdd = rdd1.groupByKey() ``` ##### 3.1.8 `reduceByKey` `reduceByKey` 算子用于对键值对 RDD 中相同键的值进行聚合操作。 ```scala val reducedRdd = rdd1.reduceByKey(_ + _) ``` --- #### 3.2 行动算子(Action) 行动算子用于触发 Spark 作业的执行,并返回结果给 Driver 程序或写入外部存储。 ##### 3.2.1 `collect` `collect` 算子用于将所有 RDD 的数据收集到 Driver 端,适用于小数据集。 ```scala val result = rdd.collect() ``` ##### 3.2.2 `count` `count` 算子用于统计 RDD 中元素的总数。 ```scala val total = rdd.count() ``` ##### 3.2.3 `take` `take` 算子用于从 RDD 中取出前 n 个元素。 ```scala val firstThree = rdd.take(3) ``` ##### 3.2.4 `foreach` `foreach` 算子用于对 RDD 中的每个元素执行某个操作,通常用于输出或写入外部系统。 ```scala rdd.foreach(println) ``` ##### 3.2.5 `saveAsTextFile` `saveAsTextFile` 算子用于将 RDD 的内容保存为文本文件。 ```scala rdd.saveAsTextFile("output_path") ``` --- #### 3.3 使用场景 - **数据清洗与预处理**:使用 `map`、`filter`、`flatMap` 等算子对原始数据进行格式转换和过滤。 - **数据聚合与统计**:使用 `reduceByKey`、`groupByKey` 等进行键值对的聚合操作。 - **数据合并与去重**:使用 `union` 和 `distinct` 对多个数据源进行合并和去重。 - **数据连接**:使用 `join` 对两个键值对 RDD 进行连接。 - **结果输出**:使用 `collect`、`foreach`、`saveAsTextFile` 将结果输出到控制台或文件系统。 --- #### 3.4 示例代码 ```python list1 = [1, 2, 3, 4, 5, 6, 7, 8] list2 = [5, 6, 7, 8, 9, 10] rdd1 = sc.parallelize(list1, 2) rdd2 = sc.parallelize(list2, 2) rdd3 = rdd1.union(rdd2) rdd4 = rdd3.distinct() rdd4.foreach(print) ``` 该代码展示了 `union` 和 `distinct` 的组合使用,先合并两个列表,再去除重复元素[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值