RDD(Resilient Distrubuted Dataset)
RDD
什么是RDD
- RDD(Resilient Distributed Dataset)叫做弹性分布式数据集,是Spark中最基本的数据抽象,它代表一个不可变、可分区、里面的元素可并行计算的集合。
- RDD具有数据流模型的特点:自动容错、位置感知性调度和可伸缩性。
- RDD允许用户在执行多个查询时显式地将数据缓存在内存中,后续的查询能够重用这些数据,这极大地提升了查询速度。
IO流和RDD读取数据的区别:IO流只能读取具体的数据格式的数据;RDD可以读取多格式多来源的数据,且RDD不可变,只可返回新的RDD。
常提起的RDD的概念:
- 一组分区,即数据集的基本组成单位
- 一个计算每个分区的函数
- RDD之间的依赖关系
- 一个Partitioner,即RDD的分片函数
- 一个列表,存储存取每个Partition的优先位置(preferred location)
RDD表示只读分区的数据集,对RDD进行改动,只能通过RDD的转换操作,由一个RDD得到一个新的RDD,新的RDD包含了从其他RDD衍生所必须的信息,RDD们之间存在依赖,RDD的执行是按照血缘关系延时计算的。
如果血缘关系较长,可以通过持久化RDD(例如checkpoint)来切断血缘关系。
spark中所有的RDD方法都成为算子,主要分为两类:
转换算子
行动算子
RDD的创建主要分为3种:
在集合中创建RDD
parallelize => val rdd[int] = parallelize(Array(1,2,3,4),numpartition) makeRDD => val rdd[int] = sc.makeRDD(List(1,2,3,4))
从外部存储创建RDD
val rdd[sring] = sc.textFile("hdfs://centos7:9000/ ...txt")
从其他RDD转换
应用场景
- 使用程序中的集合创建RDD,主要用于进行测试,可以在实际部署到集群运行之前,自己使用集合构造测试数据,来测试后面的spark应用的流程。
- 使用本地文件创建RDD,主要用于的场景为:在本地临时性地处理一些存储了大量数据的文件。
- 使用HDFS文件创建RDD,应该是最常用的生产环境处理方式,主要可以针对HDFS上存储的大数据,进行离线批处理操作。
RDD的转换可大致分为两种类型:
一、value类型:
(map(func),返回一个新的RDD,该RDD由每一个输入元素经过func函数转换后组成)
(mappartition()可以对一个RDD中所有的分区进行遍历;效率优于map算子,减少了发送到执行器执行的交互次数;可能会出现OOM)网络交互越多,效率越低 (mappartitionwithIndex,可返回分区信息)
(flatmap(func) 类似于map,但是每一个输入元素可以被映射为0或多个输出元素,所以func应该返回一个序列,而不是单一元素。)flatmap(x=>List())
(union(otherDataset),对源RDD和参数RDD求并集后返回一个新的RDD)
(subtract(otherDataset),计算差的一种函数,去除两个RDD中相同的元素,不同的RDD将保留下来)
(intersection(otherDataset),对源RDD和参数RDD求交集后返回一个新的RDD)
二、k-v类型
(partitionBy(k,v)RDD,对pairRDD进行分区操作,如果原有的partionRDD和现有的partionRDD是一致的话就不进行分区,否则就会生成ShuffleRDD,即会产生shuffle过程)
val rdd = sc.parallelize(Array((1,"aa"),(2,"bb"),(3,"cc"),(4,"dd"))) =>rdd.partitions.size = 4
val rdd2 = rdd.partitionBy(分区器) =>rdd2.partitions.size = 2
(GroupBy(),利用groupByKey也是对每个key进行操作,但只是生成一个sequence)
val words = Array("one","one","one","two","two","three","three","four")
val wordPairRDD = ac.parallelize(words).map(word=>(word,1))
val group = wordPairRDD.groupByKey() =>group.collect()
group.map(t=>(t._1,t._2.sum))
(reduceByKey(numTasks)在一个(K,V)的RDD上调用,返回一个(K,V)的RDD,使用指定的reduce函数,将相同的key的值聚到一起,reduce任务的个数可以通过第二个可选的参数来设置)
RDD的算子可大致分为3类:
Transformation(转换):根据数据集创建一个新的数据集,计算后返回一个新RDD;例如:一个rdd进行map操作后生了一个新的rdd。
Action(动作):对rdd结果计算后返回一个数值value给驱动程序;
例如:collect算子将数据集的所有元素收集完成返回给驱动程序。控制算子
转换
map(func) 返回一个新的RDD,该RDD由每一个输入元素经过func函数转换后组成
filter(func) 返回一个新的RDD,该RDD由经过func函数计算后返回值为true的输入元素组成
flatMap(func) 类似于map,但是每一个输入元素可以被映射为0或多个输出元素(所以func应该返回一个序列,而不是单一元素)
mapPartitions(func) 类似于map,但独立地在RDD的每一个分片上运行,因此在类型为T的RDD上运行时,func的函数类型必须是Iterator[T] => Iterator[U]
mapPartitionsWithIndex(func) 类似于mapPartitions,但func带有一个整数参数表示分片的索引值,因此在类型为T的RDD上运行时,func的函数类型必须是(Int, Interator[T]) => Iterator[U]
union(otherDataset) 对源RDD和参数RDD求并集后返回一个新的RDD
intersection(otherDataset) 对源RDD和参数RDD求交集后返回一个新的RDD
groupByKey([numTasks]) 在一个(K,V)的RDD上调用,返回一个(K, Iterator[V])的RDD
reduceByKey(func, [numTasks]) 在一个(K,V)的RDD上调用,返回一个(K,V)的RDD,使用指定的reduce函数,将相同key的值聚合到一起,与groupByKey类似,reduce任务的个数可以通过第二个可选的参数来设置
sortByKey([ascending], [numTasks]) 在一个(K,V)的RDD上调用,K必须实现Ordered接口,返回一个按照key进行排序的(K,V)的RDD
sortBy(func,[ascending], [numTasks]) 与sortByKey类似,但是更灵活
join(otherDataset, [numTasks]) 在类型为(K,V)和(K,W)的RDD上调用,返回一个相同key对应的所有元素对在一起的(K,(V,W))的RDD
cogroup(otherDataset, [numTasks]) 在类型为(K,V)和(K,W)的RDD上调用,返回一个(K,(Iterable,Iterable))类型的RDD
coalesce(numPartitions) 减少 RDD 的分区数到指定值。
repartition(numPartitions) 重新给 RDD 分区
repartitionAndSortWithinPartitions(partitioner) 重新给 RDD 分区,并且每个分区内以记录的 key 排序
动作
reduce(func) reduce将RDD中元素前两个传给输入函数,产生一个新的return值,新产生的return值与RDD中下一个元素(第三个元素)组成两个元素,再被传给输入函数,直到最后只有一个值为止。
collect() 在驱动程序中,以数组的形式返回数据集的所有元素
count() 返回RDD的元素个数
first() 返回RDD的第一个元素(类似于take(1))
take(n) 返回一个由数据集的前n个元素组成的数组
takeOrdered(n, [ordering]) 返回自然顺序或者自定义顺序的前 n 个元素
saveAsTextFile(path) 将数据集的元素以textfile的形式保存到HDFS文件系统或者其他支持的文件系统,对于每个元素,Spark将会调用toString方法,将它装换为文件中的文本
saveAsSequenceFile(path) 将数据集中的元素以Hadoop sequencefile的格式保存到指定的目录下,可以使HDFS或者其他Hadoop支持的文件系统。
saveAsObjectFile(path) 将数据集的元素,以 Java 序列化的方式保存到指定的目录下
countByKey() 针对(K,V)类型的RDD,返回一个(K,Int)的map,表示每一个key对应的元素个数。
foreach(func) 在数据集的每一个元素上,运行函数func
foreachPartition(func) 在数据集的每一个分区上,运行函数func
控制算子
cache 对于重复使用的算子,进行cache做缓存使用,数据只保存在内存中,性能提升
persist 可选取持久化级别
checkPoint 数据容错,当数据计算的时候,机器挂了,重新追溯到checkPoint的目录下checkPoint是将RDD持久化到磁盘中,还可以切断RDD之间的依赖关系。
RDD(Resilient Distrubuted Dataset)相关推荐
- Apache Spark 2.2.0 中文文档 - Spark RDD(Resilient Distributed Datasets)
Spark RDD(Resilient Distributed Datasets)论文 概要 1: 介绍 2: Resilient Distributed Datasets(RDDs) 2.1 RDD ...
- Spark的核心RDD(Resilient Distributed Datasets弹性分布式数据集)
Spark的核心RDD(Resilient Distributed Datasets弹性分布式数据集) 铺垫 在hadoop中一个独立的计算,例如在一个迭代过程中,除可复制的文件系统(HDFS)外没有 ...
- RDD(弹性分布式数据集)
1.什么是RDD RDD(分布式弹性数据集)是对分布式计算的抽象,代表要处理的数据,一个数据集,RDD是只读分区的集合.数据被分片,分成若干个数据分片,存储到不同的节点中,可以被并行的操作,所以叫分布 ...
- 目前最强性能的人脸检测算法(Wider Face Dataset)
<月令七十二候集解>:"二月中,分者半也,此当九十日之半,故谓之分.秋同义."<春秋繁露·阴阳出入上下篇>说:"春分者,阴阳相半也,故昼夜均而寒暑 ...
- 【计算机视觉】INRIA 行人数据集 (INRIA Person Dataset)
官网: http://pascal.inrialpes.fr/data/human/ 下载地址: ftp://ftp.inrialpes.fr/pub/lear/douze/data/INRIAPer ...
- RDD(Resilient Distributed Datasets 弹性分布式数据集)
RDD是spark计算框架的核心,spark相比于hadoop的优越性在RDD中体现得淋漓尽致.对于RDD的介绍,最好的资料就是那篇专门介绍RDD的论文了,已经有中文翻译.使用scala编写spark ...
- DND(darmstadt noise dataset)数据集的坑
忙活了好久,以为可以使用DND进行训练模型,以为它和SIDD一样有input和groundtruth,这样可以当成训练集去训练去噪模型 其实并不是! 这个DND数据集,并不能提供训练,也就是说它并不能 ...
- spark学习笔记:弹性分布式数据集RDD(Resilient Distributed Dataset)
弹性分布式数据集RDD 1. RDD概述 1.1 什么是RDD RDD(Resilient Distributed Dataset)叫做弹性分布式数据集,是Spark中最基本的数据抽象,它代表一个不可 ...
- 【作业】研一(互联网新技术作业)
北京邮电大学 2022年暑期学校<互联网新技术及服务>平时作业–简答题 一.简述对"互联网+"的理解,用例子说明"互联网+"的技术源动力和未来发展趋 ...
最新文章
- nodejs -- promise的返回
- Nature Methods:微生物来源分析包SourceTracker——结果解读和使用教程
- 修改Intelij IDEA的maven下载地址为国内阿里云镜像
- mysql数据库杀掉堵塞_mysql数据库杀掉堵塞进程
- threejs模型可视化编辑器_一个近乎无门槛、零基础的3D场景编辑器
- python导入模块--案例
- 书摘---创业36条军规1:创业是怎么回事
- xml 导入SQL Server 2005
- c#数组赋初值_【自学C#】|| 笔记 13 数组
- 怎样在photoshop中快速批量,修改图片
- 打造黑苹果(一)组装硬件的选择与组装
- c++写入二进制、TXT文件,读取二进制、TXT文件,切分字符串(入数组)
- 手游加速器代理改全局
- 厦门大学计算机系录取分数线贵州,厦门大学2016年在贵州各专业录取分数线
- 【Coding】LSF作业系统查看bsub提交历史
- 微信影视站域名防封、微信影视站公众号域名防封
- 深信服上网行为管理(AC)、安全网关(SG)学习笔记
- 第二十二章 Unity 光照贴图
- 大学生web前端期末大作业实例代码 (1500套,建议收藏) HTML+CSS+JS
- 水滴动态IP:一篇文章告诉你,IP地址是如何划分的
热门文章
- java lang NoClassDefFoundError org/apache/ibatis/session/Sq
- 黑鲨4pro和小米11哪个好
- 【时间序列分析】09.AR(p)序列的谱密度及其他性质
- 计算机教师成长计划,2020年信息技术教师个人工作计划
- 不要错误使用聚集索引
- Qt创建控制台程序选择构建套件问题“No suitable kits found”
- c语言制作蒲公英图形,AI怎么制作蒲公英的种子? ai绘制蓬松白球的教程
- 全网最全的 php8 新特性
- hdu - 6406 Taotao Picks Apples(离线+离散+技巧)
- Unity 笔刷大小过大甚至于调到最小都无法使用