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 ...
随机推荐
- pdo::quey excu excute 区别
PDO::query(PHP环境下同)和PDOStatement::execute函数均能实现SELECT查询功能,但官方文档并未见对此设计初衷的说明,此外还有个PDO::exec函数功能也很类似.天 ...
- 【Cocos2d-X(1.x 2.x) 修复篇】iOS6 中 libcurl.a 无法通过armv7s编译以及iOS6中无法正常游戏横屏的解决方法
本站文章均为李华明Himi原创,转载务必在明显处注明:转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/iphone-cocos2dx/1000.html ...
- 第二篇 makefile的基本结构
makefile用于定义并描述源文件之间的依赖关系,用于说明如何编译各个源文件并生成最终的可执行文件,规则是makefile中的基本组成部分. 一个最基本的依赖规则如下所示: targets代表这个规 ...
- ubuntu16.04 下 NVIDIA GTX1050ti 显卡驱动 PPA安装
本文参考资料链接: http://blog.csdn.net/10km/article/details/61191230 前几天在京东商城上花了6999元买了台笔记本(惠普(HP)暗影精灵II代Pro ...
- Linux环境下 多线程下载 (Python 实现版)
本文是多年前学习编程时参照一个网友程序的基础之上改写的, 采用Python语音编写, 多线程下载功能, 可以有效提高Linux下原有下载工具中的一些不足,以下给出具体代码. #!/usr/bin/py ...
- IoT 通信协议
/********************************************************************************* * IoT 通信协议 * 说明: ...
- win10系统如何进入BIOS模式
前言 安装双系统时,一般需要设置一些BOOT的选项值,比如security boot的选项.以前都是重启之后按F2或者F12等进入BIOS模式的, 但是博主按照这种方式没有正确进入,本文就针对这一问题 ...
- HDU 3746:Cyclic Nacklace(KMP循环节)
Cyclic Nacklace Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- About DOM
文档对象模型,简称DOM.是HTML页面结构给javascript提供的一个入口,它就像一个桥梁,连接两者的关系.通过DOM,JavaScript拥有访问并修改HTML的权限. 一.DOM模型: 首先 ...
- (5)可变、不可变和hash函数
分类情况 与列表相似,列表用[],元组是()表示 内存角度看列表与数字的变与不变 列表 >>>l = [1,2,3,4] >>>id(l) 4392665160 & ...