Learning Spark 第四章——键值对处理
本章主要介绍Spark如何处理键值对。K-V RDDs通常用于聚集操作,使用相同的key聚集或者对不同的RDD进行聚集。部分情况下,需要将spark中的数据记录转换为键值对然后进行聚集处理。
我们也会对键值对RDD的高级特性——分区进行讨论,用户可以控制RDD在节点间的布局,确保数据在同一机器上面,减少通信开销,将极大地提高效率。数据分区的选择与单机程序数据结构的选择一样,都能对程序的性能产生极大的影响。
主要分为以下几个章节:
- 创建PairRDD
- Transformation on Pair RDD
- Actions on Pair RDD
- 数据分区partition
Motivation
spark对Pair RDD提供了一系列的特殊操作。例如reduceByKey可以对RDD按照key进行聚合;join方法可以对两个RDD按照相同元素进行分组合并。
创建 Pair RDD
有多重方法可以创建Pair RDD,也可以将其他类型的RDD转化为Pair RDD。 下面代码将字符串第一个单词作为key
scala示例:
input.map(x => (x.split(" ")(0), x))
java没有内置的元组类型,可以引入scala.Tuple2,代码如下
PairFunction<String, String, String> keyData = new PairFunction<String, String, String>() { public Tuple2<String, String> call(String x) { returnnew Tuple2(x.split(" ")[0], x);
}
};
JavaPairRDD<String, String> rdd = input.mapToPair(keyData);
Transformation on Pair RDDs
Pair RDD可以进行通用的转换操作,例如map等。由于它包含元组,我们传入的函数其参数应该为元组。
reduceByKey:与reduce类似,对RDD进行合并。对RDD中每个元素进行操作,按照相同的key,对value进行操作并合并;
foldByKey:提供初值为0,要求合并操作对0没有影响。
以上两个转换在实际执行时,会先在各个节点进行combine,然后再进行全局合并,提升性能。
示例1:求取平均值
示例2:word count
实际上word count可以使用countByValue简化计算
input.flatMap(x =>x.split(" ")).countByValue()
combineByKey:是按照Key进行合并的通用函数,可以实现大部分按单Key合并的操作,它允许用户输入与输出类型不同;可以根据情况禁用map side aggregation(map过程的合并操作),例如groupByKey的map side aggregatation并不能提高性能,一般禁用。
示例:按key求平均值
combineByKey的数据流如下图所示:
并行级别调整
RDD的分区数直接影响着spark执行的并行程度,可以指定分区数对spark的并行程度进行微调。
代码示例
有 时需要在grouping和aggregating的上下文环境之外改变RDD分区,可以通过Spark提供的repartition工具,由于涉及 shuffle操作,代价很高。当减少RDD分区时,可以使用coalesce合并,数据移动更少,性能更优。可以通过 rdd.partitions.size()确定分区数,判断是否可用coalesce。
分组
groupBy将RDD元素按照函数处理,将结果作为主键进行分组;
groupByKey按照主键进行分组;
可以使用特定的reduce函数代替groupBy+reduce,因为可以将归约后结果放入RDD,而不是归约前的数据,提高效率。
cogroup可以对多个RDD按照相同主键进行分组,是join连接处理的基础。
连接
spark支持内连接、左外连接、右外连接和交叉链接。参照数据库中join的概念进行理解。
排序
RDD排序可以保证后续的调用,数据都是有序的。
例如将String与int混合的RDD进行排序:
Pair RDD可执行的转换总结如下所示:
Action on Pair RDDs
决定RDDs分区
PageRank 是个迭代算法,要执行很多的连接,所以这是个 RDD 分区的好用例。 该算法包括两个数据集:一个是(pageID, linkList),其元素包含了每个页的邻居 列表;另一个是(pageID, rank),其元素是每个页的当前 rank。处理流程如下:
1. 初始化每页的 rank 为 1.0
2. 对每次迭代,页面 p 发送 rank(p)/numNeighbors(p)的贡献给它的邻居(该 页连接出去的)
3. 设置每页的 rank 为 0.15+0.85*contributionsReceived。
最后两步重复的多次迭代,算法会收敛到每个页面都有正确的 PageRank 值。实 际上,一般要运行大约 10 次迭代。
- 将link持久化,避免分区间数据交互;
- 使用mapValues创建ranks,保留了分区信息,第一次join开销不大;
- 最后在reduceByKey后面使用mapValues,因为reduceByKey的结果时有分区的,此时mapValues继承分区信息,提高效率;
自定义分区
Learning Spark 第四章——键值对处理的更多相关文章
- 《Deep learning》第四章——数值计算
数值计算 机器学习算法通常需要大量的数值计算.这通常是指通过迭代过程更新解的估计值来解决数学问题的算法,而不是通过解析过程推导出公式来提供正确解的方法.常见的操作包括优化(找到最小化或最大化函数值的参 ...
- Learning Spark中文版--第四章--使用键值对(2)
Actions Available on Pair RDDs (键值对RDD可用的action) 和transformation(转换)一样,键值对RDD也可以使用基础RDD上的action(开工 ...
- Learning Spark中文版--第四章--使用键值对(1)
本章介绍了如何使用键值对RDD,Spark中很多操作都基于此数据类型.键值对RDD通常在聚合操作中使用,而且我们经常做一些初始的ETL(extract(提取),transform(转换)和load ...
- Spark学习之键值对操作总结
键值对 RDD 是 Spark 中许多操作所需要的常见数据类型.键值对 RDD 通常用来进行聚合计算.我们一般要先通过一些初始 ETL(抽取.转化.装载)操作来将数据转化为键值对形式.键值对 RDD ...
- Spark 键值对RDD操作
键值对的RDD操作与基本RDD操作一样,只是操作的元素由基本类型改为二元组. 概述 键值对RDD是Spark操作中最常用的RDD,它是很多程序的构成要素,因为他们提供了并行操作各个键或跨界点重新进行数 ...
- Spark中的键值对操作-scala
1.PairRDD介绍 Spark为包含键值对类型的RDD提供了一些专有的操作.这些RDD被称为PairRDD.PairRDD提供了并行操作各个键或跨节点重新进行数据分组的操作接口.例如,Pa ...
- Spark中的键值对操作
1.PairRDD介绍 Spark为包含键值对类型的RDD提供了一些专有的操作.这些RDD被称为PairRDD.PairRDD提供了并行操作各个键或跨节点重新进行数据分组的操作接口.例如,Pa ...
- 3. 键值对RDD
键值对RDD是Spark中许多操作所需要的常见数据类型.除了在基础RDD类中定义的操作之外,Spark为包含键值对类型的RDD提供了一些专有的操作在PairRDDFunctions专门进行了定义.这些 ...
- 【原】Learning Spark (Python版) 学习笔记(二)----键值对、数据读取与保存、共享特性
本来应该上周更新的,结果碰上五一,懒癌发作,就推迟了 = =.以后还是要按时完成任务.废话不多说,第四章-第六章主要讲了三个内容:键值对.数据读取与保存与Spark的两个共享特性(累加器和广播变量). ...
随机推荐
- [KMP]【学习笔记】
Oulipo Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 36916 Accepted: 14904 Descript ...
- POJ2104 K-th Number [分块做法]
传送:主席树做法http://www.cnblogs.com/candy99/p/6160704.html 做那倒带修改的主席树时就发现分块可以做,然后就试了试 思想和教主的魔法差不多,只不过那个是求 ...
- 【51Nod 1244】莫比乌斯函数之和
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1244 模板题... 杜教筛和基于质因子分解的筛法都写了一下模板. 杜教筛 ...
- linux系统top命令查看系统状态
Linux系统可以通过top命令查看系统的CPU.内存.运行时间.交换分区.执行的线程等信息.通过top命令可以有效的发现系统的缺陷出在哪里.是内存不够.CPU处理能力不够.IO读写过高. 使用SSH ...
- [LeetCode] Palindrome Permutation II 回文全排列之二
Given a string s, return all the palindromic permutations (without duplicates) of it. Return an empt ...
- [LeetCode] Single Number III 单独的数字之三
Given an array of numbers nums, in which exactly two elements appear only once and all the other ele ...
- 玩转Redis之Window安装使用(干货)
距离上次定Gc.Db框架,好久没有更新博客了,今日没什么事,就打算就Redis写点东西. Redis是一个开源(BSD许可),内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理.它支持字符 ...
- phylogeny analysis
Multiple Alignment: MUSCLE ProbCons T-Coffee ClustalW Alignment curation: Gblocks Remove positions w ...
- Linux工具入门:make工具与Makefile文件
1. make工具 利用make工具可以自动完成编译工作,这些工作包括: 如果修改了某几个源文件,则只重新编译这几个源文件 如果某个头文件被修改了,则重新编译所有包含该头文件的源文件 利用这种自动编译 ...
- 【poj2096】 Collecting Bugs
http://poj.org/problem?id=2096 (题目链接) 题意 有一个程序,其中有s个子结构,每个子结构出bug的概率相等.bug总共分成n类,每种bug出现的概率相等.每天找出一个 ...