Spark基础系列之三--RDD编程基础上
2020-05-03 本文已影响0人
微生活_小阿楠
传送门
Spark实战系列之一--Spark是什么
Spark实战系列之二--什么是RDD以及RDD的常用API
Spark实战系列之三--RDD编程基础上
Spark实战系列之四--RDD编程基础下
Spark实战系列之五--键值对RDD
Spark实战系列之六--数据读写
Spark实战系列之七--综合案例
Spark基础系列之八--Spark SQL是什么
Spark基础系列之九--使用Spark SQL读写数据库
传送门
一、RDD创建
1)从文件系统中加载数据,创建RDD
- Spark采用textFile()方法来从文件系统中加载数据创建RDD
- 该方法把文件的URI作为参数,这个URI可以是:
1>本地文件系统的地址
2>或者是分布式文件系统HDFS的地址
3>或者是Amazon S3的地址等等
//从本地文件系统中加载数据创建RDD
val lines = sc.textFile("file:///usr/local/spark/mycode/rdd/word.txt")
//从分布式文件系统HDFS中加载数据
//三条语句是完全等价的,可以使用其中任意一种方式
val lines = sc.textFile("hdfs://localhost:9000/user/hadoop/word.txt")
val lines = sc.textFile("/user/hadoop/word.txt")
val lines = sc.textFile("word.txt")
2)通过并行集合(数组),创建RDD
- 可以调用SparkContext的parallelize方法
//在集合(数组)上创建
val array = Array(1,2,3,4,5)
val rdd = sc.parallelize(array)
//在列表中创建
val list = List(1,2,3,4,5)
val rdd = sc.parallelize(list)
二、RDD操作
1)转换操作
- 对于RDD而言,转换得到的RDD是惰性求值的,也就是说,整个转换过程只是记录了转换的轨迹,并不会发生真正的计算,只有遇到行动操作时,才会发生真正的计算,开始从血缘关系源头开始,进行物理的转换操作。
- 典例1:filter(func)
val lines = sc.textFile(file:///usr/local/spark/mycode/rdd/word.txt)
val linesWithSpark = lines.filter(line.contains("Spark"))
- 典例2:map(func)
val lines = sc.textFile(file:///usr/local/spark/mycode/rdd/word.txt)
val linesWithSpark = lines.map(line.contains(" "))
- 典例3:flatMap(func)
val lines = sc.textFile(file:///usr/local/spark/mycode/rdd/word.txt)
val linesWithSpark = lines.flatMap(line.contains(" "))
- 典例4:groupByKey()
groupByKey()应用于(k,v)键值对的数据集时,返回一个新的(k,Iterable)形式的数据集
- 典例5:reduceByKey(func)
在典例4的基础上,把每个key传递到函数func中进行聚合后得到value的结果
2)行动操作
- 行动操作是真正触发计算的地方。Spark程序执行到行动操作时,才会执行真正的计算,从文件中加载数据,完成一次又一次转换操作,最终,完成行动操作得到结果。
- 典例:
3)惰性机制
- 所谓的“惰性机制”是指,整个转换过程只是记录了转换的轨迹,并不会发生真正的计算,只有遇到行动操作时,才会触发“从头到尾”的真正的计算。
- 也正因为这样,对于迭代计算而言,代价是很大的,迭代计算经常需要多次重复使用同一组数据
- 可以通过持久化(缓存)机制避免这种开销,我将在下一篇Spark实战系列之四--RDD编程基础中详细说明。