Spark计算框架(Pair RDD行动和变换)

一、概念

  • 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()返回按键排序的RDDrdd.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]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值