小白学习Spark系列三:RDD常用方法总结
上一节简单介绍了Spark的基本原理以及如何调用spark进行打包一个独立应用,那么这节我们来学习下在spark中如何编程,同样先抛出以下几个问题。
- Spark支持的数据集,如何理解?
- Spark编程中常用到的操作?
一、RDD基础
1、RDD简介
在上一节的组件图Spark Core中我们简单提到了对弹性分布式数据集:RDD(Resilient Distributed DataSet),它表示分布在多个计算节点上可以并行操作的元素集合,是Spark主要得编程抽象。一般我们广为熟知的数值类型是整型、字符型等,那么RDD是包含这些任意数值类型的不可变对象。在实际编程中,和其他数值类型除了操作不同外并没有直观的区别。
2、惰性求值
为了节省空间和提高运算效率,Spark使用惰性求值的方式将一些操作合并到一起来减少计算数据的步骤,这就使得RDD支持两种类型的操作:转化操作和行动操作。转化操作会由一个RDD生成另一个新的RDD,而行动操作是会对RDD计算出一个结果,并将结果返回到驱动程序中或者存储到外部存储系统中。
转化操作是惰性求值的,意思就是在调用行动操作之前Spark是不会开始真正计算的,它只会使用谱系图来记录这些不同RDD之间的依赖关系,这样就可以在后期行动操作时按需计算真正需要的数据,也可以依靠谱系图在持久化的RDD丢失部分数据时恢复所丢失的数据。例如,在行动操作 first() 中,Saprk只需要扫描文件直到找到第一个数据为止,不需要读取整个文件。默认情况下,Spark的RDD会在每次行动操作时重新计算,如果多个行动操作重用同一个RDD,建议使用RDD.persist(),把该RDD缓存下来,避免不必要的重复计算。
那么如何区分结果是由转化操作还是行动操作计算而来的呢?可以观察结果的数据类型,转化操作返回的是RDD,而行动操作返回的是其他的数值型类型。
3、一般流程
每个Spark程序无外乎如下几个步骤:
(1)从外部数据创建出输入的RDD
(2)使用诸如 filter() 这样的转化操作对RDD进行转化,以定义新的RDD
(3)对需要重用的中间结果进行缓存
(4)使用行动操作来触发并行计算
二、RDD常用操作
1、创建RDD
以下两种创建RDD的方式相比,第一种较为常用,因为第二种方式需要整个数据集首先放在一台机器内存中。
(1)外部数据的读取
val test_rdd = sc.textFile("hdfs:///user/test.txt")
(2)驱动程序中的集合并行化
val test1_rdd = sc.parallelize(["pandas","noodles","dog"])
val test2_rdd = sc.makeRDD(["pandas","noodles","dog"])
2、转化操作
(1)针对RDD中各元素的操作
| 函数 | 作用 |
| map()(常用) | 将函数应用于RDD中每个元素,将返回值构成新的RDD |
| flatMap()(常用) | 将函数引用于RDD中每个元素,将返回的迭代器的所有内容取出重新构成新的RDD |
|
filter()(常用) |
filter()的参数为布尔函数,返回满足该布尔函数的元素构成新的RDD |
| distinct() | 去重 |
| sample(withReplacement,[seed]) | 对RDD采样,以及是否替换 |
(2)对RDD进行伪集合的操作
| 函数 | 作用 |
| union() | 生成一个包含两个RDD中所有元素的RDD,不去重。类似并集 |
| intersection() | 将两个RDD共同的元素构成新的RDD,去重。类似交集 |
| substract() | 在左边RDD中移除右边RDD中的内容,类似左连接 |
| cartesian() | 与另一个RDD笛卡尔积 |
3、行动操作
| 函数 | 作用 |
| collect()(常用) | 返回RDD中全部元素 |
| count()(常用) | 返回RDD中元素个数 |
| countByValue()(常用) | 返回各元素在RDD中出现的次数,返回类型为元组的集合 |
| take(num)(常用) | 返回RDD中num个元素 |
| top(num) | 返回RDD中最前面的num个元素 |
| takeOrder(num)(ordering) | 从RDD中按照提供的顺序返回最前面的num个元素 |
| takeSample(withReplacement,num,[seed]) | 从RDD中返回任意些元素 |
| reduce(func)(常用) | 并行整合RDD中所有数据,类似sum |
| fold(zero)(func) | 和reduce()一样,但是需要提供初始值 |
| aggregate(zeroValue)(seq0p, comb0p) | 和reduce()相似,但是通常返回不同类型的函数 |
| foreach(func)(常用) | 遍历RDD中每个元素使用传入的函数 |
4、持久化
由于Spark RDD是惰性求值的,当我们每次调用行动操作时,都会重算RDD的所有依赖,如果多次行动操作使用同一个RDD,就会导致大量的重复运算。为避免这种现象,可以对数据进行持久化,也就是存储该RDD,保存在各自的分区中。出于不同的目的,可以为RDD选择不同的持久化级别,如下所示:
| 级别 | 使用的空间 | CPU时间 | 是否在内存 | 是否在磁盘 | 备注 |
| MEMORY_ONLY | 高 | 低 | 是 | 否 | |
| MEMORY_ONLY_SER | 低 | 高 | 是 | 否 | |
| MEMORY_AND_DISK | 高 | 中等 | 部分 | 部分 | 如果数据在内存放不下,溢写到磁盘上 |
| MEMORY_AND_DISK_SER | 低 | 高 | 部分 | 部分 | 如果数据在内存放不下,溢写到磁盘上,在内存中放序列化后的数据 |
| DISK_ONLY | 低 | 高 | 否 | 是 |
scala中使用 persist() 进行缓存,unpersist()方法可以手动地把持久化RDD从缓存中移除。示例:
import org.apache.spark.storage.StorageLevel
val result = input.map(x => x*x)
result.persist(StorageLevel.DISK_ONLY)
println(result.count())
println(result.collect().mkstring(","))
结束语:纵使掌握了操作RDD的常用函数,但在实际运用中仍然会出现许多疑问。在做项目的过程中,我总结的一些踩坑经验会留在下一节中讲解~
参考:Spark大数据快速分析
小白学习Spark系列三:RDD常用方法总结的更多相关文章
- 小白学习Spark系列四:RDD踩坑总结(scala+spark2.1 sql常用方法)
初次尝试用 Spark+scala 完成项目的重构,由于两者之前都没接触过,所以边学边用的过程大多艰难.首先面临的是如何快速上手,然后是代码调优.性能调优.本章主要记录自己在项目中遇到的问题以及解决方 ...
- 小白学习Spark系列一:Spark简介
由于最近在工作中刚接触到scala和Spark,并且作为python中毒者,爬行过程很是艰难,所以这一系列分为几个部分记录下学习<Spark快速大数据分析>的知识点以及自己在工程中遇到的小 ...
- 小白学习Spark系列六:Spark调参优化
前几节介绍了下常用的函数和常踩的坑以及如何打包程序,现在来说下如何调参优化.当我们开发完一个项目,测试完成后,就要提交到服务器上运行,但运行不稳定,老是抛出如下异常,这就很纳闷了呀,明明测试上没问题, ...
- 小白学习Spark系列五:scala解析多级json格式字符串
一.背景 处理json格式的字符串,key值一定为String类型,但value不确定是什么类型,也可能嵌套json字符串,以下是使用 JSON.parseFull 来解析多层json. 二.实例代码 ...
- 小白学习Spark系列二:spark应用打包傻瓜式教程(IntelliJ+maven 和 pycharm+jar)
在做spark项目时,我们常常面临如何在本地将其打包,上传至装有spark服务器上运行的问题.下面是我在项目中尝试的两种方案,也踩了不少坑,两者相比,方案一比较简单,本博客提供的jar包适用于spar ...
- spark教程(三)-RDD认知与创建
RDD 介绍 spark 最重要的一个概念叫 RDD,Resilient Distributed Dataset,弹性分布式数据集,它是 spark 的最基本的数据(也是计算)抽象. 代码中是一个抽象 ...
- spark 系列之一 RDD的使用
spark中常用的两种数据类型,一个是RDD,一个是DataFrame,本篇主要介绍RDD的一些应用场景见代码本代码的应用场景是在spark本地调试(windows环境) /** * 创建 spark ...
- [纯小白学习OpenCV系列]官方例程00:世界观与方法论
2015-11-11 ----------------------------------------------------------------------------------- 其实,写博 ...
- Telegram学习解析系列(三) : Build Telegram报错分析总结
正好通过这次 Telegram 的运行,很想把常见的项目运行的错误好好的总结一下,在前面的博客中,又星星散散的总结过错误和一些警告的消除方法,这次把错误处理一下,还有Telegram项目中有999+的 ...
随机推荐
- JS-正则表达式实战篇(Angel著)
JS-正则表达式实战篇(Angel著) 大家会看到我最新的系列博客都是spring boot怎么突然来了一个js的呢,而且这个貌似对大家而言好像很简单的嘛,所以在写之前我说说我写这一篇文章的初衷.公司 ...
- 洛谷 P1595 信封问题
题目描述 某人写了n封信和n个信封,如果所有的信都装错了信封.求所有信都装错信封共有多少种不同情况. 输入输出格式 输入格式: 一个信封数n 输出格式: 一个整数,代表有多少种情况. 输入输出样例 输 ...
- Js计算指定日期
function DateAdd(interval,number,date) { /* * 功能:实现VBScript的DateAdd功能. * 参数:interval,字符串表达式,表示要添加的时间 ...
- LINQ体验(8)——LINQ to SQL语句之Union All/Union/Intersect和Top/Bottom和Paging和SqlMethods
我们继续解说LINQ to SQL语句,这篇我们来讨论Union All/Union/Intersect操作和Top/Bottom操作和Paging操作和SqlMethods操作 . Union Al ...
- fastjson null 值处理
偶然用到fastjson转换json 在前台用js解析竟然某些字段没有,曾经用过gson.联想到是不是相似gson默认将null值不显示了,找了下资料果真如此 直接上代码吧 import java.u ...
- [Sencha ExtJS & Touch] 在Sencha(Extjs/Touch)应用程序中使用plugins(插件)和mixins(混入)
原文链接:http://blog.csdn.net/lovelyelfpop/article/details/50853591 英文原文:Using Plugins and Mixins in You ...
- Spring JDBC数据库开发
针对数据库操作,Spring框架提供了JdbcTemplate类. 1.Spring JDBC的配置 创建配置文件applicationContext.xml,添加如下代码: <!--配置数据源 ...
- 二重积分的计算 —— 交换积分顺序(exchange the order of integration)
交换积分顺序的诀窍在数形结合: 1. 几句顺口溜 后积先定限,限内穿条线,先交下限写,后交上限见 先积 x,画横线(平行于 x 轴),右减左: 先积 y,画竖线(平行于 y 轴),上减下: 2. 简单 ...
- Java访问HTTPS时证书验证问题
为了尽可能避免安全问题,公司的很多系统服务都逐步https化,虽然开始过程会遇到各种问题,但趋势不改.最完美的https应用是能实现双向认证,客户端用私钥签名用服务端公钥加密,服务端用私钥签名客户端都 ...
- Java-JDK:JDK清单
ylbtech-Java-JDK:JDK清单 1.返回顶部 2.返回顶部 3.返回顶部 4.返回顶部 5.返回顶部 6.返回顶部 作者:ylbtech出处:http://y ...