Spark学习笔记2:RDD编程
通过一个简单的单词计数的例子来开始介绍RDD编程。
import org.apache.spark.{SparkConf, SparkContext}
object word {
def main(args: Array[String]): Unit = {
val conf = new SparkConf().setMaster("local").setAppName("word")
val sc = new SparkContext(conf)
val input = sc.parallelize(List("spark core scala python java spark scala"))
val words = input.flatMap(line => line.split(" "))
val counts = words.map(word => (word,1)).reduceByKey{case (x,y) => x + y}
counts.foreach(println)
}
}
使用Scala语言,IDE使用IntelliJ IDEA 。在IDEA上运行Spark应用需要添加Maven依赖。
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.10</artifactId>
<version>1.6.3</version>
</dependency>
运行结果:

运行Spark应用,首先需要导入Spark包,这里使用Maven来连接公共仓库中的Spark包。
接下来创建一个SparkConf来配置应用,这里使用local即本地模式,方便调试代码。
然后基于这个SparkConf创建一个SparkContext对象。
有了SparkContext以后,就可以来访问Spark,创建RDD。sc.parallelize创建了一个Seq对象 RDD,可以对这个RDD进行操作。flatmap和map就是对这个RDD进行的一些操作完成单词计数,这些操作接下来将进行解释,最后将结果在后台显示出来。这样一个简单的Spark应用就完成了。
RDD编程
前一章介绍过 RDD即弹性分布式数据集,是Spark对数据的核心抽象,RDD就是分布式的元素集合。
Spark对数据的操作无外乎创建RDD,转化已有RDD以及调用RDD操作进行求值。Spark会自动将RDD中的数据分发到集群上,并将操作并行化执行。
- 创建RDD
可以使用两种方法创建RDD:读取一个外部数据集,或在驱动器程序里分发驱动器程序中的对象集合。
例如:SparkContext.textFile()用来读取文本文件作为一个字符串RDD。
lines = sc.textFile("input.txt")
还可以把程序中一个已有的集合传给SparkContext的parallelize()方法 如我们上面单词计数例子里的那样。
- RDD操作
RDD创建出来后,可以进行两种类型的操作:转化操作和行动操作。
a、转化操作
RDD的转化操作是返回新的RDD的操作,转化出来的RDD是惰性求值的,只有在行动操作中用到这些RDD时才会被计算。
常见转化操作有:
- map()操作用于接收一个函数,把这个函数用于RDD中的每个元素,将函数的返回结果作为结果RDD中对应元素的值。如 val counts = words.map(word =>(word,1)) 将每一个单词单词映射成键值对。
- filter()接受函数,将RDD中满足该函数的元素放入新的RDD中返回。
- flatMap()被分别应用到输入RDD的每个元素上,返回的是一个包含各个迭代器可访问的所有元素的RDD。可以用于将输入的字符串切分成单词。
- 集合操作:distinct() 生成只包含不同元素的新RDD, union(other)返回一个包含两个RDD中所有元素的RDD , intersection(other)只返回两个RDD中都有的元素,subtract(other)返回只存在于第一个RDD而不存在于第二个RDD中的元素,cartesian(other)笛卡儿积,返回所有可能的(a,b)对,a,b分别来自两个不同的RDD。
b、行动操作
行动操作把最终求得的结果返回到驱动器程序或者写入外部存储系统中。
常见的行动操作有:
- count()用来返回计数结果
- take(n)用来收集RDD中的n个元素
- collect()用来获取整个RDD中的元素
- reduce()用来接收一个函数作为参数,这个函数要操作两个相同元素类型的RDD数据并返回一个同样类型的新元素。 如 val sum = rdd.reduce( (x,y) => x+ y ) 用于计算输入集合中元素的和。
- fold() 和reduce()的区别是需要指定一个初始值作为每个分区第一次调用的结果。如 val sum = rdd.fold(1)(_ + _)
- aggregate()函数不同于fold()和reduce(),不要求返回值类型必须与所操作的RDD类型相同,使用aggregate()时需要提供返回类型的初始值。使用aggregate()计算RDD平均值如下:
val input = sc.parallelize(List(1,2,3,4,5,6,7,8,9,10))
val result = input.aggregate((0,0))(
(acc , value) => (acc._1 + value , acc._2 + 1)
(part1 , part2) => (part1._1 + part2._1 , part1._2 + part2._2))
val avg = result._1 / result._2.toDouble
aggregate()函数计算过程:
value是input中的值 , 即 1 到 10
在分布式计算中,将input分成多个分区,假设3个分区 ,分别计算 (1,2,3) (4,5,6) (7,8,9,10)
第一个分区用(acc , value) => (acc._1 + value , acc._2 + 1) 计算过程,初始值为0:
0 + 1 , 0 + 1
1 + 2 , 1 + 1
2 + 3 , 2 + 1
最终这个分区得到 (6,3) 即表示和为6,有3个元素。同样,另外两个分区得到(15,3) (34,4)
接着调用(part1 , part2) => (part1._1 + part2._1 , part1._2 + part2._2)) 这一步
将三个分区的和以及元素个数加起来得到(55,10)
- 持久化缓存
Spark在每次调用行动操作时都会重算RDD以及它的所有依赖,为了避免多次计算同一个RDD,可以让Spark对数据进行持久化。
持久化数据所在的节点发生故障时,Spark会在需要用到缓存的数据时重算丢失的数据分区。最好的做法是将数据备份到多个节点上。
使用persist()用来把数据以序列化的形式缓存,默认情况下会缓存在JVM的堆空间中。如果缓存的数据太多,内存中放不下,Spark会自动利用最近最少使用的缓存策略把最老的分区从内存中移除。
unpersist()用于手动把持久化的RDD从缓存中移除。
Spark学习笔记2:RDD编程的更多相关文章
- Spark学习笔记3——RDD(下)
目录 Spark学习笔记3--RDD(下) 向Spark传递函数 通过匿名内部类 通过具名类传递 通过带参数的 Java 函数类传递 通过 lambda 表达式传递(仅限于 Java 8 及以上) 常 ...
- Spark学习笔记2——RDD(上)
目录 Spark学习笔记2--RDD(上) RDD是什么? 例子 创建 RDD 并行化方式 读取外部数据集方式 RDD 操作 转化操作 行动操作 惰性求值 Spark学习笔记2--RDD(上) 笔记摘 ...
- Spark学习笔记之RDD中的Transformation和Action函数
总算可以开始写第一篇技术博客了,就从学习Spark开始吧.之前阅读了很多关于Spark的文章,对Spark的工作机制及编程模型有了一定了解,下面把Spark中对RDD的常用操作函数做一下总结,以pys ...
- Spark学习笔记11面向对象编程
面向对象编程 11.1 object类 11.1.1定义一个简单的类 11.1.2 field的getter与setter 定义类包含,定义类的field及方法.其格式如下 class Cla ...
- Spark菜鸟学习营Day3 RDD编程进阶
Spark菜鸟学习营Day3 RDD编程进阶 RDD代码简化 对于昨天练习的代码,我们可以从几个方面来简化: 使用fluent风格写法,可以减少对于中间变量的定义. 使用lambda表示式来替换对象写 ...
- spark学习笔记总结-spark入门资料精化
Spark学习笔记 Spark简介 spark 可以很容易和yarn结合,直接调用HDFS.Hbase上面的数据,和hadoop结合.配置很容易. spark发展迅猛,框架比hadoop更加灵活实用. ...
- Spark学习笔记0——简单了解和技术架构
目录 Spark学习笔记0--简单了解和技术架构 什么是Spark 技术架构和软件栈 Spark Core Spark SQL Spark Streaming MLlib GraphX 集群管理器 受 ...
- Spark学习笔记之SparkRDD
Spark学习笔记之SparkRDD 一. 基本概念 RDD(resilient distributed datasets)弹性分布式数据集. 来自于两方面 ① 内存集合和外部存储系统 ② ...
- Spark学习笔记-GraphX-1
Spark学习笔记-GraphX-1 标签: SparkGraphGraphX图计算 2014-09-29 13:04 2339人阅读 评论(0) 收藏 举报 分类: Spark(8) 版权声明: ...
- Spark学习笔记1——第一个Spark程序:单词数统计
Spark学习笔记1--第一个Spark程序:单词数统计 笔记摘抄自 [美] Holden Karau 等著的<Spark快速大数据分析> 添加依赖 通过 Maven 添加 Spark-c ...
随机推荐
- 如何控制jquery ui弹窗下方按钮水平居中
1.问题背景 一般情况下,jquery ui弹窗下方的按钮是居右的,但是有时系统为了达到美观统一,需要将按钮放在中间 2.问题原因 <!DOCTYPE html> <html> ...
- A+B for Input-Output Practice (IV)
A+B for Input-Output Practice (IV) Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 ...
- Magento里显示指定分类的所有子分类
如何在magento左侧导航栏里显示父分类和子分类名,如果需要在magento显示指定分类的所有子分类,可以用以下的方法: <!--? php if($category--->hasC ...
- magento -- 给Magento提速之缓存上的探索
依然在为Magento提速做努力,除了自带的缓存和编译,之前的所作的很多努力都是从减少JS,Css,图片等载入时间入手,而对页面载入耗时最早有时也是最大的一部分--获取页面数据没有做太多处理,以gap ...
- JPEG文件格式
格式:JFIF(JPEG档的交换格式)压缩:JPEG(灰阶影像压缩比约为10:1:彩色影像约为20:1)以JPEG文件格式保存的图像实际上是2个不同格式的混合物:JPEG格式规范本身,用来定义图像的压 ...
- 《DSP using MATLAB》Problem 4.11
代码: %% ---------------------------------------------------------------------------- %% Output Info a ...
- ppt罗列项排版
关于罗列项的排版(1,....2,......3,......4,........)
- test20180829
试题限制均为128MB,1Sec 总分150. 试题一 A题 问题描述: 小A得到了一棵美丽的有根树.这棵树由n个节点以及n - 1条有向边构成,每条边都从父亲节点指向儿子节点,保证除了根节点以外的每 ...
- stenciljs 学习八 组件测试
测试对于框架来说比较重要,对于web 组件的测试同样很重要,类似的jest 很方便,stenciljs也是基于jest 开发的 包含两个核心api render(), flush() 测试配置 pac ...
- AllJoyn 了解
AllJoyn是一个中性平台系统,旨在简化邻近异构分布式移动通信网络系统.这里的异构性不仅表示不同的设备,而且可以是具有不同操作系统和不同类型的设备(例如个人电脑.手机.平板电脑和消费性电子产品),并 ...