- RDD 简介与特点
- 创建 RDD 的三种方式
-
map
算子与flatMap
算子的区别
1. RDD 简介
RDD
(Resilient Distributed Databases),即弹性分布式数据集
,它是 Spark 对数据的核心抽象,也就是 Spark 对于数据进行处理的基本单位。使用 Spark 对数据进行处理首先需要把数据转换为 RDD,然后在 RDD 上对数据进行相应的操作。RDD 有两种算子,分别是转换(transformations
)算子和行动(actions
)算子。
在 Spark 中,对数据处理的操作流程如下:创建 RDD
=> 对 RDD 进行转化操作
=> 执行行动操作求值
我们暂且不管RDD的特点,RDD的深层次概念,我们先把 RDD 简单理解为一堆数据即可。
讲得形象点,举个例子:
经过多年的努力,邵奈一收获了很多粉丝,粉丝来自于全国各地,有广东的、有背景的、有上海的、有湖南的等等,由于粉丝们的热情追捧,强烈建议要组建一个大型学习群,名称叫做: “奈一大数据学习联盟” 。
如果将此例子用到我们大数据,可以这么理解:
所有的粉丝是一堆的数据
,只不过,这些粉丝
,是分布在很多个省份
的,类比于一堆大大的数据,是存储到很多台服务器
上的,省份
就是服务器
,在没有成立 “奈一大数据学习联盟” 之前,其实粉丝
也是一直都存在的,分布在各个省
。今天,邵奈一在网络上发了一则公告,说:“奈一大数据学习联盟”,今天!成立了!!!其实就相当于给了这一堆数据起了一个名称了,这个名称,其实就相当于是 RDD 的名称
,而这一堆数据
,其实就是 RDD ,就是弹性分布式数据集
!
当你成立了一个联盟,也就是你申明了一个 RDD
,接下来你就可以做很多事情了,比如,你可以淘汰过滤
粉丝(把没评论没点赞的淘汰掉嘿嘿),还可以统计一下哪个省份的粉丝
最多(山顶的朋友,请举起你的双手),还可以做很多很多的事情,其实这些事情,就相当你后面会学到的算子
一样。
2. RDD 特点
可先参考此文章:(二)RDD概述及五大特性
0x02 RDD 的创建方式1. 环境准备
- 启动 Spark Shell(需要先启动 Spark!)
spark-shell --master spark://master:7077
- 启动 HDFS (本教程为分布式集群环境,如没部署好,请参考本博客其他课程)
start-all.sh
准备一个文件,如下是我的文件:
hadoop fs -cat /files/put.txt
shao nai yi
nai nai yi yi
shao nai nai
进入HDFS的Web UI界面可以发现是存放在slave1和slave2上的:
2. 三种创建方式
- 在稳定的存储系统中,比如 HDFS 文件中创建
这种就像前面所讲的组建联盟的方式,HDFS文件原本就是存储在多台服务器上的,你只要写了声明就可以,只需要将路径修改为HDFS相应的路径即可,如我的是:hdfs://master:9999/files/put.txt
则写成:
val putRDD = sc.textFile("hdfs://master:9999/files/put.txt")
又如教程里:Spark Shell入门教程 里的词频统计代码是直接从Linux文件系统中直接生成 RDD :
val textFileRDD = sc.textFile("/home/hadoop-sny/datas/word.txt")
此外,也可以从Cassandra、HBase 等中创建。
- 由存在的RDD上创建一个新的RDD
比如,奈一之前有组建过一个组织的,叫 “复制粘贴玩大数据联盟” ,现在我要对组织进行升级了,改组成 “奈一大数据学习联盟” ,道理一个样。
val wordRDD = textFileRDD.flatMap(line => line.split(" "))
代码解释:原本是有一个叫 textFileRDD
的RDD的,现在通过一个 flatMap 算子,生成了一个新的 RDD ,名称为 wordRDD
。
重点: map
算子与 flatMap
算子的区别:
map 算子
putRDD.map(line => line).collect
返回结果为:
Array(shao nai yi, nai nai yi yi, shao nai nai)
flatMap 算子
putRDD.flatMap(line => line.split(" ")).collect
返回结果为:
Array(shao, nai, yi, nai, nai, yi, yi, shao, nai, nai)
以上可知:map 算子
,其实是对 RDD 里面的每一行元素进行映射关系,本例子是映射成自己,RDD 的元素是不变;其实如果一行元素只有一个数字,其实也是可以让这个数字进行相应的加减乘除的。flatMap 算子
,比map 算子多了一个 flat 操作,可以理解为将元素打平的意思,而打平的条件就是split(" ")
,按照空格进行打平,所以会发现,到最后,我们每一行的RDD其实是进行了打平操作的,得到的结果就是打平后的结果。
关键理解:其实,RDD 可以理解为是一个只有一列的具有多行
的表!
如上面HDFS上的 put.txt
文件:
shao nai yi
nai nai yi yi
shao nai nai
一共有三行,只有一列,这三行所对应的列分别为shao nai yi
\ nai nai yi yi
\ shao nai nai
,flatMap 其实就是对这三行的这一列数据进行了打平操作。
3. 从内存中已经存在的序列列表中生成
val data= Array(1,2,3,4,5)
// 创建一个RDD
val dataRDD = sc.parallelize(data)
// 创建一个有两个分区的RDD
val dataRDD2 = sc.parallelize(data,2)
// 对RDD的结果进行叠加计算
dataRDD .reduce((a,b) => a + b)
因为这种方式是把内存中的数据生成 RDD ,所以一般用得很少,毕竟内存很有限,一般是开发原型、测试和学习用一下而已。
0xFF 总结- 本教程虽然是讲解 RDD ,但是在操作的过程中也顺便将一些相关联的知识点带出来了,有利于大家理解。
- 请继续学习本博客的其他相关文章,加油。
作者简介:邵奈一
全栈工程师、市场洞察者、专栏编辑
| 公众号 | 微信 | 微博 | CSDN | 简书 |
福利:
邵奈一的技术博客导航
邵奈一原创不易,如转载请标明出处,教育是一生的事业。