0x00 教程内容
- RDD 简介与特点
- 创建 RDD 的三种方式
map
算子与flatMap
算子的区别
0x01 RDD 概念
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 ,但是在操作的过程中也顺便将一些相关联的知识点带出来了,有利于大家理解。
- 请继续学习本博客的其他相关文章,加油。