Spark学习—PairRDD编程
2017-05-16 13:29
176 查看
PairRDD:键值对RDD,其是Spark中转化操作常用的数据类型。上一篇文件《》我们就使用了PairRDD。PairRDD是很多程序的构成要素,因为他提供了并行操作或跨节点重新进行数据分组的操作接口。本文将结合Java示例讲解PairRDD相关接口操作。
对应Java创建PairRDD,由于Java没有自带的二元组类型,因此Spark的Java API中使用scala.Tuple2类来创建二元组,同时使用mapToPair()函数来代替map()函数。
比如上一篇文章的例子:Spark学习—RDD编程
Pair RDD的转化操作(以键值对集合{(1, 2), (3, 4), (3, 6)}为例)
combineByKey:最为常用的基于键进行聚合的函数,和aggregate()一样,combineByKey()可以返回与输入数据的类型不一样的返回值。
createCombiner:组合器函数,用于将V类型转换成C类型,输入参数为RDD[K,V]中的V,输出为C
mergeValue:合并值函数,将一个C类型和一个V类型值合并成一个C类型,输入参数为(C,V),输出为C
mergeCombiners:合并组合器函数,用于将两个C类型值合并成一个C类型,输入参数(C,C),输出为C
numPartitions:结果RDD分区数,默认保持原有的分区数
partitioner:分区函数,默认为HashPartitioner
针对两个pair RDD的转化操作(rdd = {(1, 2), (3, 4), (3, 6)}other = {(3, 9)})
连接方式:左外连接、右外连接、交叉连接和内连接;
join:内连接,只有在两个pair RDD 中都存在的键才叫输出。当一个输入对应的某个键有多个值时,生成的pair RDD 会包括来自两个输入RDD 的每一组相对应的记录。
leftOuterJoin:在使用leftOuterJoin() 产生的pair RDD 中,源RDD 的每一个键都有对应的记录。每个键相应的值是由一个源RDD 中的值与一个包含第二个RDD 的值的Option(在Java
中为Optional)对象组成的二元组。
rightOuterJoin:rightOuterJoin() 几乎与leftOuterJoin() 完全一样,只不过预期结果中的键必须出现在第二个RDD 中,而二元组中的可缺失的部分则来自于源RDD 而非第二个RDD。
cogroup:对多个共享同一个键的RDD进行分组。对两个键的类型均为K 而值的类型分别为V 和W 的RDD 进行cogroup() 时,得到的结果RDD 类型为[(K, (Iterable[V], Iterable[W]))]。如果其中的一个RDD
对于另一个RDD 中存在的某个键没有对应的记录,那么对应的迭代器则为空。cogroup() 提供了为多个RDD 进行数据分组的方法。
Pair RDD的行动操作(以键值对集合{(1, 2), (3, 4), (3, 6)}为例)
代码地址:http://git.oschina.net/a123demi/sparklearning
一. PairRDD创建
很多存储键值对的数据格式会在读取时直接返回其键值对数据组成的pair RDD,同时也可以调用map()函数来实现,传递的函数需要返回键值对。对应Java创建PairRDD,由于Java没有自带的二元组类型,因此Spark的Java API中使用scala.Tuple2类来创建二元组,同时使用mapToPair()函数来代替map()函数。
比如上一篇文章的例子:Spark学习—RDD编程
二. PairRDD相关接口
PairRDD本质还是RDD,相对RDD的操作方法接口,PairRDD都支持。1. PairRDD的转化操作
函数名 | 目的 | 示例 | 结果 |
reduceByKey(func) | 合并具有相同键的值 | rdd.reduceByKey((x, y) => x + y) | {(1,2), (3,10)} |
groupByKey() | 对具有相同键的值进行分组 | rdd.groupByKey() | {(1,[2]),(3, [4,6])} |
combineByKey( createCombiner, mergeValue, mergeCombiners, partitioner) | 使用不同的返回类型合并具有相同键的值 | ||
mapValues(func) | 对pair RDD 中的每个值应用一个函数而不改变键 | rdd.mapValues(x => x+1) | {(1,3), (3,5), (3,7)} |
flatMapValues(func) | 对pair RDD 中的每个值应用一个返回迭代器的函数,然后对返回的每个元素都生成一个对应原键的键值对记录通常用于符号化 | rdd.flatMapValues(x => (x to 5)) | {(1,2), (1,3), (1,4), (1,5), (3,4), (3,5)} |
keys() | 返回一个仅包含键的RDD | rdd.keys() | {1, 3,3} |
values() | 返回一个仅包含值的RDD | rdd.values() | {2, 4,6} |
sortByKey() | 返回一个根据键排序的RDD | rdd.sortByKey() | {(1,2), (3,4), (3,6)} |
combineByKey:最为常用的基于键进行聚合的函数,和aggregate()一样,combineByKey()可以返回与输入数据的类型不一样的返回值。
createCombiner:组合器函数,用于将V类型转换成C类型,输入参数为RDD[K,V]中的V,输出为C
mergeValue:合并值函数,将一个C类型和一个V类型值合并成一个C类型,输入参数为(C,V),输出为C
mergeCombiners:合并组合器函数,用于将两个C类型值合并成一个C类型,输入参数(C,C),输出为C
numPartitions:结果RDD分区数,默认保持原有的分区数
partitioner:分区函数,默认为HashPartitioner
函数名 | 目的 | 示例 | 结果 |
subtractByKey | 删掉RDD 中键与other RDD 中的键 相同的元素 | dd.subtractByKey(other) | {(1, 2)} |
join | 对两个RDD 进行内连接 | rdd.join(other) | {(3, (4, 9)), (3,(6, 9))} |
rightOuterJoin | 对两个RDD 进行连接操作, 确保第一个RDD 的键必须存在 (右外连接) | rdd.rightOuterJoin(other) | {(3,(Some(4),9)), 3,(Some(6),9))} |
leftOuterJoin | 对两个RDD 进行连接操作, 确保第二个RDD 的键必须存在 (左外连接) | rdd.leftOuterJoin(other) | {(1,(2,None)), (3,(4,Some(9))), (3,(6,Some(9)))} |
cogroup | 将两个RDD 中拥有相同键的 数据分组到一起 | rdd.cogroup(other) | {(1,([2],[])), (3,([4, 6],[9]))} |
连接方式:左外连接、右外连接、交叉连接和内连接;
join:内连接,只有在两个pair RDD 中都存在的键才叫输出。当一个输入对应的某个键有多个值时,生成的pair RDD 会包括来自两个输入RDD 的每一组相对应的记录。
leftOuterJoin:在使用leftOuterJoin() 产生的pair RDD 中,源RDD 的每一个键都有对应的记录。每个键相应的值是由一个源RDD 中的值与一个包含第二个RDD 的值的Option(在Java
中为Optional)对象组成的二元组。
rightOuterJoin:rightOuterJoin() 几乎与leftOuterJoin() 完全一样,只不过预期结果中的键必须出现在第二个RDD 中,而二元组中的可缺失的部分则来自于源RDD 而非第二个RDD。
cogroup:对多个共享同一个键的RDD进行分组。对两个键的类型均为K 而值的类型分别为V 和W 的RDD 进行cogroup() 时,得到的结果RDD 类型为[(K, (Iterable[V], Iterable[W]))]。如果其中的一个RDD
对于另一个RDD 中存在的某个键没有对应的记录,那么对应的迭代器则为空。cogroup() 提供了为多个RDD 进行数据分组的方法。
2. PairRDD的行动操作
函数名 | 目的 | 示例 | 结果 |
countByKey() | 对每个键对应的元素分别计数 | rdd.countByKey() | {(1, 1), (3, 2)} |
collectAsMap() | 将结果以映射表的形式返回, 以便查询 | rdd.collectAsMap() | Map{(1, 2), (3,4), (3, 6)} |
lookup(key) | 返回给定键对应的所有值 | rdd.lookup(3) | [4, 6] |
三.示例
代码地址:http://git.oschina.net/a123demi/sparklearning
相关文章推荐
- 从零开始学习Spark--第1章 安装和测试
- 关于自定义spark组件的学习体会
- Spark计算Pi---Spark学习笔记2
- Spark RDD Transformation 详解---Spark学习笔记7
- Spark Hadoop集群部署与Spark操作HDFS运行详解---Spark学习笔记10
- Spark RDD Action 详解---Spark学习笔记8
- Spark 学习笔记
- Spark计算Pi运行过程详解---Spark学习笔记4
- spark应用开发---Spark学习笔记6
- Spark安装与学习
- 从零开始学习Spark--第4章 Spark的各种运行方式
- 一步一步学习openfire+spark(2)——介绍几个概念
- Spark源码编译---Spark学习笔记1
- 从零开始学习Spark--第5章 SparkContext类分析
- openfire+spark+jwchat+服务器日志输出 环境搭建(学习笔记)
- MLBase:Spark生态圈里的分布式机器学习系统
- 从零开始学习Spark--第3章 spark的example
- Spark基础知识学习分享
- RDD Dependency详解---Spark学习笔记9
- spark0.8.0安装与学习