一、概念
- Pair RDD: 键值对形式的弹性分布式数据集,这是Spark中一种常见的数据类型,常用于聚合操作,也经常会将一些初始的ETL保存为键值对的格式。键值对RDD拥有不同于普通RDD的新操作,比如分组。
二、变换算子
- 对单个pair RDD 的变换(例子:{(1,2), (3, 4), (3, 6)})
首先初始化该RDD:
val rdd = sc.parallelize(Array((1, 2), (3, 4), (3, 6)))
函数名 | 目的 | 示例 | 结果 |
---|
reduceByKey(func) | 按照相同的键合并 | rdd.reduceByKey((x, y) => x + y) | {(1, 2), (3, 10)} | groupByKey() | 按相同的键分组 | rdd.groupByKey() | {(1, [2]), (3, [4, 6])} | conbineByKey(createCombiner, mergeValue, mergeCombiners, partitioner) | 按相同的键合并,返回不同的结果类型 | 返回每个键所有的值的总和和总数的元组:rdd.combineByKey(x=>(x, 1), (x:(Int, Int), y) => (x._1 + y, x._2 + 1), (x:(Int, Int), y: (Int, Int)) => (x._1 + y._1, x._2 + y._2)) | {(1,(2,1)), (3,(10,2))} | 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)} |
- 对两个pair RDD的变换(rdd={(1,2), (3,4), (3,6)}, other={(3,9)})
首先初始化RDD:
val rdd = sc.parallelize(Array((1, 2), (3, 4), (3, 6)))
val other = sc.parallelize(Array((3,9)))
函数名 | 目的 | 示例 | 结果 |
---|
subtractByKey | 去除另一个RDD中存在键的元素 | rdd.subtractByKey(other) | {(1, 2)} | join | 两个RDD执行内连接 | rdd.join(other) | {(3,(4, 9)), (3, (6, 9))} | rightOuterJoin | 两个RDD执行连接操作,但是other RDD中的key必须存在 | rdd.rightOuterJoin(other) | {(3, (Some(4), 9)),(3, (Some(6), 9))} | leftOuterJoin | 两个RDD执行连接操作,但是第一个RDD中的key必须存在 | 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]))} |
三、行动算子
- 对Pair RDD的动作(例子:{(1, 2), (3, 4), (3, 6)})
和变换算子一样,所有的基本RDD的所有传统动作都适用于pair RDD。而pair RDD有些额外的动作,用到了数据的键值对的特性。
函数名 | 目的 | 示例 | 结果 |
---|
countByKey() | 计算每个主键的元素个数 | rdd.countByKey() | Map(1 -> 1, 3 -> 2) | collectAsMap() | 收集数据为map结构方便查找 | rdd.collectAsMap() | Map(1 -> 2, 3 -> 6) | lookup(key) | 返回关联key的所有值 | rdd.lookup(3) | [4, 6] |
|