Spark RDD学习
RDD(弹性分布式数据集)是Spark的核心抽象。它是一组元素,在集群的节点之间进行分区,以便我们可以对其执行各种并行操作。
创建RDD的两种方式:
- 并行化驱动程序中的现有数据;
- 引用外部存储系统中的数据集。
并行化集合
SparkContext
的parallelize
方法。复制集合的每个元素以形成可以并行操作的分布式数据集。%Spark
val info=Array(1,2,3,4)
val distInfo=sc.parallelize(info)
%操作分布式数据集
distinfo.reduce((a, b) => a + b)
外部数据集
在Spark中,可以从Hadoop支持的任何类型的存储源(如HDFS,Cassandra,HBase甚至本地文件系统)创建分布式数据集。Spark 支持文本文件(text files),SequenceFiles 和其他 Hadoop InputFormat。
SparkContext
的textFile
方法可用于创建RDD的文本文件。此方法获取文件的URI(本地路径或hdfs://,s3n://等
)并读取文件的数据,将文件读取成一个行集合。
一旦创建完成,distFiile
就能做数据集操作。例如,我们可以用下面的方式使用 map
和 reduce
操作将所有行的长度相加:distFile.map(s => s.length).reduce((a, b) => a + b)
。
RDD的两种操作:
- 转换
- 行动
转换:在Spark中,转换的作用是从现有数据集创建新数据集。转换是惰性的,因为它们仅在动作需要将结果返回到驱动程序时才计算。
map(func)
- 它返回一个新的分布式数据集, 该数据集是通过函数func
传递源的每个元素而形成的。filter(func)
- 它返回一个新数据集, 该数据集是通过选择函数func
返回true
的源元素而形成的。
flatMap(func)
- 每个输入项可以映射到零个或多个输出项, 因此函数func
应该返回序列而不是单个项。mapPartitions(func)
- 它类似于map,但是在RDD的每个分区(块)上单独运行, 因此当在类型T的RDD上运行时,func
必须是Iterator <T> => Iterator <U>
类型。mapPartitionsWithIndex(func)
- 它类似于mapPartitions
,它为func
提供了一个表示分区索引的整数值,因此当在类型T的RDD上运行时,func
必须是类型(Int,Iterator <T>)=> Iterator <U>
。sample(withReplacement, fraction, seed)
- 它使用给定的随机数生成器种子对数据的分数部分进行采样,有或没有替换。union(otherDataset)
- 它返回一个新数据集,其中包含源数据集和参数中元素的并集。intersection(otherDataset)
- 它返回一个新的RDD,其中包含源数据集和参数中的元素的交集。distinct([numPartitions]))
- 它返回一个新数据集,其中包含源数据集的不同元素。groupByKey([numPartitions])
- 当在(K,V)
对的数据集上调用时,它返回(K,Iterable)
对的数据集。reduceByKey(func, [numPartitions])
- 当调用(K,V)
对的数据集时,返回(K,V)
对的数据集,其中使用给定的reduce
函数func
聚合每个键的值,该函数必须是类型(V,V)=>V
。aggregateByKey(zeroValue)(seqOp, combOp, [numPartitions])
- 当调用(K,V)
对的数据集时,返回(K,U)
对的数据集,其中使用给定的组合函数和中性“零”值聚合每个键的值。sortByKey([ascending], [numPartitions])
- 它返回按键按升序或降序排序的键值对的数据集,如在布尔ascending
参数中所指定。join(otherDataset, [numPartitions])
-当调用类型(K,V)
和(K,W)
的数据集时,返回(K,(V,W))
对的数据集以及每个键的所有元素对。通过leftOuterJoin
,rightOuterJoin
和fullOuterJoin
支持外连接。cogroup(otherDataset, [numPartitions])
-当调用类型(K,V)
和(K,W)
的数据集时,返回(K,(Iterable,Iterable))
元组的数据集。此操作也称为groupWith
。cartesian(otherDataset)
-当调用类型为T和U的数据集时,返回(T,U)
对的数据集(所有元素对)。pipe(command, [envVars])
-通过shell命令管道RDD的每个分区,例如, 一个Perl或bash脚本。coalesce(numPartitions)
-它将RDD中的分区数减少到numPartitions
。repartition(numPartitions)
-它随机重新调整RDD中的数据,以创建更多或更少的分区,并在它们之间进行平衡。repartitionAndSortWithinPartitions(partitioner)
- 它根据给定的分区器对RDD进行重新分区,并在每个生成的分区中键对记录进行排序。
行动:在Spark中,操作的作用是在对数据集运行计算后将值返回给驱动程序。
- reduce(func):它使用函数func(它接受两个参数并返回一个)来聚合数据集的元素。该函数应该是可交换的和关联的,以便可以并行正确计算。
- collect():它将数据集的所有元素作为数组返回到驱动程序中。在过滤器或其他返回足够小的数据子集的操作之后,这通常很有用。
count()
:它返回数据集中的元素数。first()
它返回数据集的第一个元素(类似于take(1)
)take(n)
它返回一个包含数据集的前n个元素的数组。takeSample(withReplacement, num, [seed])
它返回一个数组,其中包含数据集的num个元素的随机样本,有或没有替换,可选地预先指定随机数生成器种子。takeOrdered(n, [ordering])
它使用自然顺序或自定义比较器返回RDD的前n个元素。- saveAsTextFile(path):它用于将数据集的元素作为文本文件(或文本文件集)写入本地文件系统,HDFS或任何其他Hadoop支持的文件系统的给定目录中。
- saveAsSequenceFile(path):它用于在本地文件系统,HDFS或任何其他Hadoop支持的文件系统中的给定路径中将数据集的元素编写为Hadoop SequenceFile。
- saveAsObjectFile(path):它用于使用Java序列化以简单格式编写数据集的元素,然后可以使用
SparkContext.objectFile()
加载。 - countByKey():它仅适用于类型(K,V)的RDD。因此,它返回(K,Int)对的散列映射与每个键的计数。
- foreach(func):它在数据集的每个元素上运行函数
func
以获得副作用,例如更新累加器或与外部存储系统交互。
Spark RDD学习的更多相关文章
- Spark RDD学习笔记
一.学习Spark RDD RDD是Spark中的核心数据模型,一个RDD代表着一个被分区(partition)的只读数据集. RDD的生成只有两种途径: 一种是来自于内存集合或外部存储系统: 另一种 ...
- Spark菜鸟学习营Day3 RDD编程进阶
Spark菜鸟学习营Day3 RDD编程进阶 RDD代码简化 对于昨天练习的代码,我们可以从几个方面来简化: 使用fluent风格写法,可以减少对于中间变量的定义. 使用lambda表示式来替换对象写 ...
- Spark菜鸟学习营Day1 从Java到RDD编程
Spark菜鸟学习营Day1 从Java到RDD编程 菜鸟训练营主要的目标是帮助大家从零开始,初步掌握Spark程序的开发. Spark的编程模型是一步一步发展过来的,今天主要带大家走一下这段路,让我 ...
- 【spark 深入学习 06】RDD编程之旅基础篇02-Spaek shell
--------------------- 本节内容: · Spark转换 RDD操作实例 · Spark行动 RDD操作实例 · 参考资料 --------------------- 关于学习编程方 ...
- 【spark 深入学习 03】Spark RDD的蛮荒世界
RDD真的是一个很晦涩的词汇,他就是伯克利大学的博士们在论文中提出的一个概念,很抽象,很难懂:但是这是spark的核心概念,因此有必要spark rdd的知识点,用最简单.浅显易懂的词汇描述.不想用学 ...
- spark学习13(spark RDD)
RDD及其特点 1)RDD(Resillient Distributed Dataset)弹性分布式数据集,是spark提供的核心抽象.它代表一个不可变.可分区.里面的元素可并行计算的集合 2)RDD ...
- Spark菜鸟学习营Day5 分布式程序开发
Spark菜鸟学习营Day5 分布式程序开发 这一章会和我们前面进行的需求分析进行呼应,完成程序的开发. 开发步骤 分布式系统开发是一个复杂的过程,对于复杂过程,我们需要分解为简单步骤的组合. 针对每 ...
- Spark菜鸟学习营Day4 单元测试程序的编写
Spark菜鸟学习营Day4 单元测试程序的编写 Spark相比于传统代码是比较难以调试的,单元测试的编写是非常必要的. Step0:需求分析 在测试案例编写前,需完成需求分析工作,明确程序所有的输入 ...
- Spark菜鸟学习营Day2 分布式系统需求分析
Spark菜鸟学习营Day2 分布式系统需求分析 本分析主要针对从原有代码向Spark的迁移.要注意的是Spark和传统开发有着截然不同的思考思路,所以我们需要首先对原有代码进行需求分析,形成改造思路 ...
随机推荐
- 初识python 之 爬虫:爬取某电影网站信息
注:此代码仅用于个人爱好学习使用,不涉及任何商业行为! 话不多说,直接上代码: 1 #!/user/bin env python 2 # author:Simple-Sir 3 # time:201 ...
- C# 使用vs2017 创建类 时 注意点
1.创建新类后,在其他类无法new 这个新创建的类 ,怎么回事? 原因很简单,创建类时不带修饰符,默认是被保护的类 上图为创建类后的默认代码 ,没有修饰符 ,在其他类中无法引入改类的命名空间,会显示找 ...
- [ SQLAlchemy ] 经验总结、QA
1.filter 和 filter_by [ 共同点 ]:查询后,用于过滤数据 [ 不同点 ]: 1.filter:过滤查询后的数据,用SQL表达式 session.query(MyClass).fi ...
- 利用static来实现单例模式
一:之前旧的写法 class Singleton{ private Singleton() {} private static Singleton instance = null; public sy ...
- mybatis(1.2)
为什么执行sql语句后 数据库表中不会更新 需要我们手动配置 两种方法 如下: 1:调用SqlSession接口的commit方法 2:获取Session的时候 SqlSessionFactory ...
- POJ2115C Looooops
http://poj.org/problem?id=2115 k位储存特点,一旦溢出,那么就到第二个循环开始返回0重新计数.问题实际转化成a+cx=b(mod 2^k)跑多少圈能够重合.因为是k位无符 ...
- JAVA8-STREAM 使用说明
概述 本人在java开发过程中,有些知识点需要记录整理,我尽量严谨的叙述我学习的经过和心得,以便备份和和大家一起进步学习,此篇文章是在网上多出搜集整理验证,结尾会注明出处,今天学习一个java8新的功 ...
- k8s的应用包管理工具helm的部署和使用
1.概述 我们一般是在k8s里面部署一些简单的应用,比如用deployment,daemonset,statefuleset的方式来部署应用,但是如果要部署一些复杂的应用,那么整个配置的编写.部署的过 ...
- Autofac实现拦截器和切面编程
Autofac.Annotation框架是我用.netcore写的一个注解式DI框架,基于Autofac参考 Spring注解方式所有容器的注册和装配,切面,拦截器等都是依赖标签来完成. 开源地址:h ...
- 了解promise、promise对象
Promise 是异步编程的一种解决方案,比传统的解决方案--回调函数和事件--更合理和更强大.它由社区最早提出和实现,ES6 将其写进了语言标准,统一了用法,原生提供了Promise对象. 所谓Pr ...