欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

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

时间:2023-04-21
一、概念

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]

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。