前言
本期会讲解到 Spark 开发中大部分常见的 *** 作算子,内容比较常用,建议大家先收藏。
学习目标
向Spark 传递函数RDD 的转换算子RDD 的行动算子
1. 向Spark 传递函数
Spark API 依赖 Driver 程序中的传递函数完成在集群上执行 RDD 转换并完成数据计算。在 Java API 中,函数所在的类需要实现 org.apache.spark.api.java.function 包中的接口。
Spark 提供了 lambda 表达式和 自定义 Function 类两种创建函数的方式。前者语法简洁、方便使用;后者可以在一些复杂应用场景中自定义需要的 Function 功能。
举个栗子,求 RDD 中数据的平方,并只保留不为0的数据。
可以用 lambda 表达式简明地定义 Function 实现,代码如下:
val input = sc.parallelize(List(-2,-1,0,1,2)) val rdd1 = input.map(x => x * x) val rdd2 = rdd1.filter(x => x != 0 )
首先用 map() 对 RDD 中所有的数据进行求平方,然后用到 filter() 来筛选不为0的数据。
其中,map() 和 filter() 就是我们最常用的转换算子,map() 接收了 一个 lambda 表达式定义的函数,并把这个函数运用到 input 中的每一个元素,最后把函数计算后的返回结果作为结果 rdd1 中对应元素的值。
同样, filter() 也接收了一个 lambda 表达式定义的函数,并将 rdd1 中满足该函数的数据放入到了新的 rdd2 中返回。
Spark 提供了很丰富的处理 RDD 数据的 *** 作算子,比如使用 distinct() 还可以继续对 rdd2 进行去重处理。
如果需要对 RDD 中每一个元素处理后生成多个输出,也有相应的算子,比如 flatMap(),它和 map() 类似,也是将输入函数应用到 RDD 中的每个元素,不过返回的不是一个元素了,而是一个返回值序列的迭代器。
最终得到的输出是一个包含各个迭代器可访问的所有元素的 RDD,flatMap() 最经典的一个用法就是把输入的一行字符串切分为一个个的单词。
举个栗子,将行数据切分成单词,对比下 map() 与 flat() 的不同。
val lines = sc.parallelize(List("hello spark","hi,flink")) val rdd1 = lines.map(line => line.split(",")) val rdd2 = lines.flatMap(line => line.split(","))
可以看到,把 lines 中的每一个 line,使用所提供的函数执行一遍,map() 输出的 rdd1 中仍然只有两个元素;而 flatMap() 输出的 rdd2 则是将原 RDD 中的数据“拍扁”了,这样就得到了一个由各列表中元素组成的 RDD,而不是一个由列表组成的 RDD。
2. RDD 的转换算子
Spark 中的转换算子主要用于 RDD 之间的转化和数据处理,常见的转换算子具体如下:
3. RDD 的行动算子
Spark 中行动算子主要用于对分布式环境中 RDD 的转化 *** 作结果进行统一地执行处理,比如结果收集、数据保存等,常用的行动算子具体如下:
以上是本期分享,如有帮助请 点赞+关注+收藏 支持下哦~
下期继续讲解 RDD 内容。
往期精彩内容回顾:
1 - Spark 概述(入门必看)
2 - Spark 的模块组成
3 - Spark 的运行原理
4 - RDD 概念以及核心结构
5 - Spark RDD 的宽窄依赖关系
6 - 详解 Spark RDD 的转换 *** 作与行动 *** 作
7 - Spark RDD 中常用的 *** 作算子
可扫码关注
大家可以加我微信(备注spark):Abox_0226,一起组队学习 Spark~
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)