键值对操作 上(Spark自学五)
键值对RDD是Spark中许多操作所需要的常见数据类型。
“分区”是用来让我们控制键值对RDD在各节点上分布情况的高级特性。使用可控的分区方式把常在一起被访问的数据放在同一个节点上,可以大大减少应用的通信开销,带来明显的性能提升。
4.1 动机
Spark为pair RDD提供了并行操作各个键或跨节点重新进行数据分组的操作接口。
4.2 创建Pair RDD
当需要把一个普通的RDD转为pair RDD时,可以调用map()函数来实现。下例为如何将由文本行组成的RDD转换为以每行的第一个单词为键的pair RDD。
例4-1: 在Python中使用第一个单词作为键创建出一个pair RDD
pairs = lines.map(lambda x: (x.split(" ")[0], x))
例4-2: 在Scala中使用第一个单词作为键创建出一个pair RDD
val pairs = lines.map(x => (x.split(" ")(0), x))
4.3 Pair RDD的转化操作
Pair RDD可以使用所有标准RDD上的可用的转化操作。
Pair RDD的转化操作(以键值对集合{(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.keys() 结果:{1,3,3}
rdd.values() 结果:{2,4,6}
rdd.sortByKey() 结果:{(1,2),(3,4),(3,6)}
筛选掉长度超过20个字符的行,如下:
例4-4: 用Python对第二个元素进行筛选
result = pairs.filter(lambda keyValue: len(keyValue[1]<20))
例4-5: 用Scala对第二个元素进行筛选、
pairs.filter{case (key, value) => value.length < 20}
4.3.1 聚合操作
使用reduceByKey()和mapValues()来计算每个键的对应值的均值。
例4-7:在Python中使用reduceByKey()和mapValues()计算每个键对应的平均值
rdd.mapValues(lambda x:(x, 1)).reduceByKey(lambda x, y: (x[0]+y[0], x[1]+y[1]))
例4-8:在Python中使用reduceByKey()和mapValues()计算每个键对应的平均值
rdd.mapValues(x => (x, 1)).reduceByKey((x, y) => (x._1 + y._1, x._2 + y._2))
解决分布式单词计数问题如下
例4-9: 用Python实现单词计数
rdd = sc.textFile("s3://...")
words = rdd.flatMap(lambda x: x.split(" "))
result = words.map(lambda x: (x, 1)).reduceByKey(lambda x, y:x+y)
例4-10: 用Scala实现单词计数
val input = sc.textFile("s3://...")
val words = input.flatMap(x => x.split(" "))
val result = words.map(x => (x, 1)).reduceByKey((x, y) => x+y)
我们可以使用countByValue()函数,以更快地实现单词计数:input.flatMap(x => x.split(" ")).countByValue().
Spark怎样确定如何分割工作:每个RDD都有固定数目的分区,分区数决定了在RDD上执行操作时的并行度。
例4-15: 在Python中自定义reduceByKey()的并行度
data = [("a", 3), ("b", 4), ("a", 1)]
sc.parallelize(data).reduceByKey(lambda x, y: x+y, 10)
4.3.2 数据分组
略
4.3.3 连接
连接数据操作:将有键的数据与另一组有键的数据一起使用。连接方式:右外连接、左外连接、交叉连接以及内连接。
例4-17:在Scala shell中进行内连接
storeAddress = {
(Store("Ritual"), "AAA"), (Store("Philz"), "BBB"),
(Store("Philz"), "CCC"), (Store("Starbucks"), "DDD")}
storeRating = {
(Store("Ritual"), 4.9), (Store("Philz"), 4.8)}
storeAddress.rightOuterJoin(storeRating) == {
(Store("Ritual"), "AAA", 4.9)),
(Store("Philz"), "BBB", 4.8)),
(Store("Philz"), "CCC", 4.8))}
例4-18:leftOuterJoin()与rightOuterJoin()
storeAddress = {
(Store("Ritual"), "AAA"), (Store("Philz"), "BBB"),
(Store("Philz"), "CCC"), (Store("Starbucks"), "DDD")}
storeRating = {
(Store("Ritual"), 4.9), (Store("Philz"), 4.8)}
storeAddress.rightOuterJoin(storeRating) == {
(Store("Ritual"), (Some("AAA"), 4.9)),
(Store("Philz"), (Some("BBB"), 4.8)),
(Store("Philz"), (Some("CCC"), 4.8))}
storeAddress.leftOuterJoin(storeRating) == {
(Store("Ritual"), ("AAA", Some(4.9))),
(Store("Starbucks"),("DDD",None)),
(Store("Philz"), ("BBB", Some(4.8))),
(Store("Philz"), ("CCC", Some(4.8)))}
4.3.4 数据排序
略
键值对操作 上(Spark自学五)的更多相关文章
- Spark学习之键值对操作总结
键值对 RDD 是 Spark 中许多操作所需要的常见数据类型.键值对 RDD 通常用来进行聚合计算.我们一般要先通过一些初始 ETL(抽取.转化.装载)操作来将数据转化为键值对形式.键值对 RDD ...
- Spark学习笔记——键值对操作
键值对 RDD是 Spark 中许多操作所需要的常见数据类型 键值对 RDD 通常用来进行聚合计算.我们一般要先通过一些初始 ETL(抽取.转化.装载)操作来将数据转化为键值对形式. Spark 为包 ...
- Redis源码解析:09redis数据库实现(键值对操作、键超时功能、键空间通知)
本章对Redis服务器的数据库实现进行介绍,说明Redis数据库相关操作的实现,包括数据库中键值对的添加.删除.查看.更新等操作的实现:客户端切换数据库的实现:键超时相关功能的实现.键空间事件通知等. ...
- go 发送post请求(键值对、上传文件、上传zip)
一.post请求的Content-Type为键值对 1.PostForm方式 package main import ( "net/http" "net/url" ...
- Spark中的键值对操作-scala
1.PairRDD介绍 Spark为包含键值对类型的RDD提供了一些专有的操作.这些RDD被称为PairRDD.PairRDD提供了并行操作各个键或跨节点重新进行数据分组的操作接口.例如,Pa ...
- Spark中的键值对操作
1.PairRDD介绍 Spark为包含键值对类型的RDD提供了一些专有的操作.这些RDD被称为PairRDD.PairRDD提供了并行操作各个键或跨节点重新进行数据分组的操作接口.例如,Pa ...
- Spark学习笔记3:键值对操作
键值对RDD通常用来进行聚合计算,Spark为包含键值对类型的RDD提供了一些专有的操作.这些RDD被称为pair RDD.pair RDD提供了并行操作各个键或跨节点重新进行数据分组的操作接口. S ...
- Spark基础:(三)Spark 键值对操作
1.pair RDD的简介 Spark为包含键值对类型的RDD提供了一些专有的操作,这些RDD就被称为pair RDD 那么如何创建pair RDD呢? 在不同的语言中有着不同的创建方式 在pytho ...
- spark入门(三)键值对操作
1 简述 Spark为包含键值对类型的RDD提供了一些专有的操作.这些RDD被称为PairRDD. 2 创建PairRDD 2.1 在sprk中,很多存储键值对的数据在读取时直接返回由其键值对数据组成 ...
随机推荐
- selenium与360极速浏览器driver配置
1)下载浏览器对应的driver,浏览器版本与driver对应关系,网址:http://www.cnblogs.com/JHblogs/p/7699951.html:driver下载地址:http:/ ...
- pyhton mechanize 学习笔记
1:简单的使用 import mechanize # response = mechanize.urlopen("http://www.hao123.com/") request ...
- 【C++】重载
参考:黄邦勇帅 1.操作符重载函数作为类的成员和友元或者独立于类的区别: 当操作符重载函数作为类的成员函数时,操作符重载函数的参数会比作为友元或者独立于类的操作符重载函数少一个参数,因为操作符重载类成 ...
- python的算法:二分法查找(1)
1.什么是二分法查找: 1.从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束: 2.如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从 ...
- Qt笔记——入门
Qt的介绍 跨平台c++图形用户界面应用程序框架 Qt的框架 父类(基类)子类(派生类) 头文件 QApplication应用程序类 Qt头文件没有.h 头文件和类名一样 有且只有一个应用程序类的对象 ...
- Tornado 模块概述
Tornado模块分类 1. Core web framework tornado.web — 包含web框架的大部分主要功能,包含RequestHandler和Application两个重要的类 t ...
- 最小生成树的Prim算法
构造最小生成树的Prim算法 假设G=(V,E)为一连通网,其中V为网中所有顶点的集合,E为网中所有带权边的集合.设置两个新的集合U和T,其中集合U用于存放G的最小生成树的顶点,集合T用于 ...
- VisualStudio 2013开发Office插件
在VS中选择创建新项目,选择App for Office 选择mail出现的位置 Task pane The app appears in the task pane of a Microsift O ...
- codeforces Round #440 B Maximum of Maximums of Minimums【思维/找规律】
B. Maximum of Maximums of Minimums time limit per test 1 second memory limit per test 256 megabytes ...
- MySql笔记之数据表
数据表:行称为记录 列称为字段 用来存储数据 一.数据类型 数据类型是指列.存储过程参数.表达式和局部变量的数据特征,它决定了数据的存储格式,代表了不同的信息类型. 在我们存储不同类型的数据时,为了 ...