Spark基础:(三)Spark 键值对操作
1、pair RDD的简介
Spark为包含键值对类型的RDD提供了一些专有的操作,这些RDD就被称为pair RDD
那么如何创建pair RDD呢? 在不同的语言中有着不同的创建方式
在python和Scala语言中创建的方式都是差不多的。
在java语言中:
java用户还需要调用专门的Spark函数mapToPair()来创建pair RDD。例如:
//映射,word -> (word,1)
JavaPairRDD<String,Integer> rdd3 = rdd2.mapToPair(new PairFunction<String, String, Integer>() {
public Tuple2<String, Integer> call(String s) throws Exception {
return new Tuple2<String, Integer>(s,1);
}
});
2、pair RDD常见的转化操作
(1)以键值对{(1,2),(3,4),(3,6)}为例子
rdd.reduceByKey((x,y)=>x+y) ===> {(1,2),(3,10)}
rdd.groupByKey() ===> {(1,[2]),(3,[4,6])}
rdd.mapValues(x=>x+1) ===> {(1,3),(3,5),(3,7)}
rdd.flatMapValues(x=>(x to 5)) ===> {(1,2),(1,3),(1,4),(1,5),(3,4),(3,5)}
(2)针对两个pair RDD的转化,以键值对rdd={(1,2),(3,4),(3,6)}和orther={(3,9)}
rdd.substractByKey(orther) ==> {(1,2)} #删除相同的
rdd.join(orther) ==> {(3,(4,9)),(3,(6,9))}
rdd.rightOuterJoin(orther) ==> {(3,(Some(4),9)),(3,(Some(6),9))}
rdd.leftOuterJoin(orther) ==> {(1,(2,None)),(3,(4,Some(9))),(3,(6,Some(9)))}
rdd.cogroupn(orther) ==> {(1,([2],[])),(3,([4,6],[9]))} #将两个RDD中相同的键的数据分组
(3)聚合操作
如reduceByKey()前面已经讲过,此处不再赘述。
并行度调优: 每个RDD都有自己固定的数目的分区,分区数决定了RDD上的执行操作的并行度,在执行聚合或者分组操作时,可以要求Spark使用给定的分区数。Spark始终尝试根据集群的大小推断一些有意义默认值。但是,有时候可以根据并行度的调优来获取更好的性能要求。
Spark还提供了repartition()函数,他会把数据通过网络进行混洗,并创建出新的分区集合,但是对数据进行重新分区是代价比较大的操作。为此,Spark提供了一款优化版的repartition(),叫coalesce()。(我们可以通过rdd.getNumPartitions查看RDD的分区)
(4)分组操作
如groupByKey()前面已经讲过,此处不再赘述。需要注意的是:返回的是[K,Iterable[V]]类型
(5)连接操作
join的操作,前面已经简单介绍
(6)数据排序
rdd.sortByKey() #注意要提供自定义的比较函数
3、pair RDD的行动操作
以键值对{(1,2),(3,4),(3,6)}为例子
rdd.countByKey() ===> {(1,1),(3,2)} #统计键出现的次数
rdd.collectAsMap() ===> Map{(1,2),(3,4),(3,6)} #返回的Map 便于查询
rdd.lookup(3) ===> [4,6] #返回给定键对应的所有值
4、数据分区
自定义分区并且持久化降低网络通信的开销
例如:Scala实现的例子
val sc=new SparkContext(…) val
userData=sc.sequenceFile[UserID,UserInfo](“hdfs://…”)
.partitionBy(new HashPartitioner(100)) //构造100个分区
.persist()
同样的我们还可以通过partitioner方法来获取RDD的分区方式
Spark基础:(三)Spark 键值对操作的更多相关文章
- spark入门(三)键值对操作
1 简述 Spark为包含键值对类型的RDD提供了一些专有的操作.这些RDD被称为PairRDD. 2 创建PairRDD 2.1 在sprk中,很多存储键值对的数据在读取时直接返回由其键值对数据组成 ...
- Spark学习之键值对操作总结
键值对 RDD 是 Spark 中许多操作所需要的常见数据类型.键值对 RDD 通常用来进行聚合计算.我们一般要先通过一些初始 ETL(抽取.转化.装载)操作来将数据转化为键值对形式.键值对 RDD ...
- Spark中的键值对操作-scala
1.PairRDD介绍 Spark为包含键值对类型的RDD提供了一些专有的操作.这些RDD被称为PairRDD.PairRDD提供了并行操作各个键或跨节点重新进行数据分组的操作接口.例如,Pa ...
- Spark中的键值对操作
1.PairRDD介绍 Spark为包含键值对类型的RDD提供了一些专有的操作.这些RDD被称为PairRDD.PairRDD提供了并行操作各个键或跨节点重新进行数据分组的操作接口.例如,Pa ...
- Redis源码解析:09redis数据库实现(键值对操作、键超时功能、键空间通知)
本章对Redis服务器的数据库实现进行介绍,说明Redis数据库相关操作的实现,包括数据库中键值对的添加.删除.查看.更新等操作的实现:客户端切换数据库的实现:键超时相关功能的实现.键空间事件通知等. ...
- Spark学习笔记3:键值对操作
键值对RDD通常用来进行聚合计算,Spark为包含键值对类型的RDD提供了一些专有的操作.这些RDD被称为pair RDD.pair RDD提供了并行操作各个键或跨节点重新进行数据分组的操作接口. S ...
- Spark学习笔记——键值对操作
键值对 RDD是 Spark 中许多操作所需要的常见数据类型 键值对 RDD 通常用来进行聚合计算.我们一般要先通过一些初始 ETL(抽取.转化.装载)操作来将数据转化为键值对形式. Spark 为包 ...
- 键值对操作 上(Spark自学五)
键值对RDD是Spark中许多操作所需要的常见数据类型. “分区”是用来让我们控制键值对RDD在各节点上分布情况的高级特性.使用可控的分区方式把常在一起被访问的数据放在同一个节点上,可以大大减少应用的 ...
- redis基础之基本键值操作和使用(三)
前言 redis安装完毕后开始使用redis,先熟悉命令行操作. redis数据的类型 键:redis的所有的键都是string类型: 值:五种类型 string:字符串类型:一个string最大可以 ...
随机推荐
- linux shell 提示符
当我们打开或者登陆到一个终端的时候都会显示一长串提示符 void@void-ThinkPad-E450:~$ 提示符一般包含当前登陆的用户名 ,主机名,以及当前工作路径路径,最后都是以 $ 或者 # ...
- Python3使用Print输出彩色字体
一.介绍 在一些开发程序中,有些输出消息需要突出显示,我们可以尝试着给他们换上更靓丽的颜色来突出显示. 二.实现过程 终端的字符颜色是用转义序列控制的,是文本模式下的系统显示功能,和具体的语言无关. ...
- 如何将声学的spectrogram(声谱图)重新反变换成时域语音信号
最近在研究一些信号分析的事情,感兴趣如何将频谱信号反变换成时域信号.fft 与ifft可以顺畅的转变,但是这个是一帧信号,当时间较长的信号再一起是,通过反变换变成一帧一帧的时域信号,如何把他们拼接起来 ...
- namaspace之pid namespace
认识Namespace namespace 是 Linux 内核用来隔离内核资源的方式.通过 namespace 可以让一些进程只能看到与自己相关的一部分资源,而另外一些进程也只能看到与它们自己相关的 ...
- 【java+selenium3】Actions模拟鼠标 (十一)
一.鼠标操作 WebElement的click()方法可实现元素的点击操作,但是没有提供鼠标的右击/双击/悬停/鼠标拖动等操作.这些操作需要通过Action类提供的方法来实现! Action常用的ap ...
- 羽夏看Win系统内核——驱动篇
写在前面 此系列是本人一个字一个字码出来的,包括示例和实验截图.由于系统内核的复杂性,故可能有错误或者不全面的地方,如有错误,欢迎批评指正,本教程将会长期更新. 如有好的建议,欢迎反馈.码字不易, ...
- (五)MySQL函数
5.1 常用函数 5.2 聚合函数(常用) 函数名称 描述 COUNT() 计数 SUM() 求和 AVG() 平均值 MAX() 最大值 MIN() 最小值 .... .... 想查询一 ...
- [Vue]浅谈Vue3组合式API带来的好处以及选项API的坏处
前言 如果是经验不够多的同志在学习Vue的时候,在最开始会接触到Vue传统的方式(选项式API),后边会接触到Vue3的新方式 -- 组合式API.相信会有不少同志会陷入迷茫,因为我第一次听到新的名词 ...
- axios通过post请求下载文件/图片
我们平常下载文件一般都是通过get请求直接访问进行下载, 但是当有特殊情况如权限控制之类的会要求我们通过post请求进行下载,这时就不一样了, 具体方法是通过协调后端,约定返回的文件流,请求的resp ...
- [bzoj4553]序列
记第i个位置有三个属性:1.ai表示原来的值:2.bi表示变成最大的值:3.ci表示变成最小的值.那么对于如果i在j的前面,那么必然有:$ai\le cj$且$bi\le aj$,那么令f[i]表示以 ...