CDA数据分析师学习之路第3期 | Spark RDD的转换操作举例
Spark RDD中的操作非常丰富,有80多种针对数据的操作。其中最重要的是Transformation(转换操作)和Action(执行操作)两类。其中转换操作采用了惰性策略,转换操作只生成元数据,相当于对业务逻辑的一种抽象描述,并不会真正执行,只有提交行动操作,这时候才开始从头到尾依次计算。
最常用的转换操作有map, mapPartitions, mapValues, flatMapValues, filter等。
1. map
针对RDD中的每个元素,经过指定的函数,转换成新的元素,进而得到新RDD
val a =sc.parallelize(1 to 9, 3)
val b = a.map(x=> x*2)
a.collect
b.collect
res10:Array[Int] = Array(1, 2, 3, 4, 5, 6, 7, 8, 9)
res11:Array[Int] = Array(2, 4, 6, 8, 10, 12, 14, 16, 18)
上述例子中把原RDD中每个元素都乘以2来产生一个新的RDD
通过toDebugString方法来查看RDD间的依赖关系和转换过程
2. mapPartitions
mapPartitions是map的一个变种。map的输入函数是应用于RDD中每个元素,而mapPartitions的输入函数是应用于每个分区
val a =sc.parallelize(1 to 9, 3)
defmyfunc[T](iter: Iterator[T]) : Iterator[(T, T)] = {
var res =List[(T, T)]()
var pre =iter.next
while(iter.hasNext) {
val cur =iter.next; res .::= (pre, cur) pre = cur; } res.iterator }
a.mapPartitions(myfunc).collect
res0:Array[(Int, Int)] = Array((1,2), (2,3), (4,5), (5,6) , (7,8), (8,9))
上述例子中的函数myfunc是把分区中一个元素和它的下一个元素组成一个Tuple。因为分区中最后一个元素没有下一个元素了,所以(3,4)和(6,7)不在结果中。
3. mapValues
mapValues顾名思义就是输入函数应用于RDD中Kev-Value的Value,原RDD中的Key保持不变,与新的Value一起组成新的RDD中的元素。
val a =sc.parallelize(List("dog", "tiger", "lion","cat", "panther", " eagle"), 2)
val b = a.map(x=> (x.length, x))
b.mapValues("x"+ _ + "x").collect
res5:Array[(Int, String)] = Array((3,xdogx), (5,xtigerx), (4,xlionx), (3,xcatx),(7,xpantherx), (5,xeaglex))
4. flatMap
与map类似,区别是RDD中的元素经map处理后只能生成一个元素,而RDD中的元素经flatmap处理后可生成多个元素来构建新RDD。
val a =sc.parallelize(1 to 4, 2)
val b =a.flatMap(x => 1 to x)
b.collect
res12:Array[Int] = Array(1, 1, 2, 1, 2, 3, 1, 2, 3, 4)
对原RDD中的每个元素x产生y个元素(从1到y,y为元素x的值)
5. flatMapValues
flatMapValues类似于mapValues,不同的在于flatMapValues应用于元素为KV对的RDD中Value。每个一元素的Value被输入函数映射为一系列的值,然后这些值再与原RDD中的Key组成一系列新的KV对。
val a =sc.parallelize(List((1,2),(3,4),(3,6)))
val b =a.flatMapValues(x=>x.to(5))
b.collect
res3:Array[(Int, Int)] = Array((1,2), (1,3), (1,4), (1,5), (3,4), (3,5))
上述例子中原RDD中每个元素的值被转换为一个序列(从其当前值到5),比如第一个KV对(1,2), 其值2被转换为2,3,4,5。然后其再与原KV对中Key组成一系列新的KV对(1,2),(1,3),(1,4),(1,5)。
6. 代码演示reduceByKey
reduceByKey针对KV形式的RDD。顾名思义,他以Key作为元素的分组依据,然后对具有相同Key的Value进行相应的函数计算,因此,Key相同的多个元素的值被reduce为一个值,然后与原RDD中的Key组成一个新的KV对。
val a =sc.parallelize(List((1,2),(3,4),(3,6)))
a.reduceByKey((x,y)=> x + y).collect
res7: Array[(Int,Int)] = Array((1,2), (3,10))
上述例子中,对Key相同的元素的值求和,因此Key为3的两个元素被转为了(3,10)。
7. 代码演示filter
对于RDD中的每一个元素,使用指定的函数进行计算,对于返回值为true的元素,筛选出来作为新RDD的元素
valrdd7=sc.makeRDD(1 to 10).filter(_%3==0)
rdd7.collect
res7:Array[(Int, Int)] = Array(3,6,9)
以上就是Spark RDD中比较常见的几个转换操作。Spark中的转换操作是用户基于已有RDD创建新的RDD的一种重要方式。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 达梦数据库、oracle数据库如何判断指定表有没有建立索引?对应的表有没有索引查询方法
- Linux服务器运行sh文件提示权限不够解决方法?飞腾服务器Permission denied问题授权方法
- 不支持图形化界面的Linux系统如何显示图像化界面?飞腾服务器显示图像化界面方法,DISPLAY environment variable is undefined问题解决方法
- 一分钟学Python| Python的函数(上)
- 数据分析与数据挖掘 - 07数据处理
- MySql8.0.19最新版本创建用户分配权限演示,You have an error in your SQL syntax权限分配问题解决方法
- linux服务器oracle数据库导出dmp文件功能演示,备份数据库命令。exp命令显示command not found解决方法,EXP-00028: 无法打开dmp进行写入问题解决
- oracle数据库exp命令导入导出dmp文件演示,oracle数据库备份还原功能
- oracle数据库impdp导入dmp文件功能演示,imp导入IMP-00038: Could not convert to environment character sets handle问题解决
- 弄懂这 5 个问题,拿下 Python 迭代器!
- windows、linux下命令行登录oracle数据库方法,查询sga参数值sql语句
- oracle数据库查询open_cursors值的sql语句,达梦数据库查询MAX_SESSION_STATEMENT值方法,MAX_SESSION_STATEMENT的最大值、上限是多少。
- 达梦数据库启用日志方法,达梦数据库查看日志是否启用,达梦数据库日志文件位置查找
- JavaScript 技术篇 - js 查看哪个元素获取了焦点,js 指定元素获取焦点方法
- 工作10年后,再看String s = new String("xyz") 创建了几个对象?