您的位置:首页 > 运维架构 > Apache

Spark入门学习——要点2

2018-09-14 16:53 405 查看

1、PairRDD的转换操作

Pair RDD的转化操作(以键值对集合{(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])}
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()返回一个仅包含键的RDDrdd.keys(){1,3,3}
values()返回一个仅包含值的RDDrdd.values(){2,4,6}
sortByKey()返回一个根据键排序的RDDrdd.sortByKey(){(1,2), (3,4), (3,6)}
subtractByKey删掉RDD 中键other RDD 中的键相同的元素
rdd.subtractByKey(other){(1, 2)}
join对两个RDD 进行内连接rdd.join(other){(3, (4, 9)), (3,(6, 9))}

2、combineByKey()

combineByKey() 是最为常用的基于键进行聚合的函数。大多数基于键聚合的函数都是用它实现的。和aggregate() 一样,combineByKey() 可以让用户返回与输入数据的类型不同的返回值。要理解combineByKey(), 要先理解它在处理数据时是如何处理每个元素的。由于combineByKey() 会遍历分区中的所有元素,因此每个元素的键要么还没有遇到过,要么就和之前的某个元素的键相同。如果这是一个新的元素,combineByKey() 会使用一个叫作createCombiner() 的函数来创建那个键对应的累加器的初始值。需要注意的是,这一过程会在每个分区中第一次出现各个键时发生,而不是在整个RDD 中第一次出现一个键时发生。如果这是一个在处理当前分区之前已经遇到的键,它会使用mergeValue() 方法将该键的累加器对应的当前值与这个新的值进行合并。由于每个分区都是独立处理的,因此对于同一个键可以有多个累加器。如果有两个或者更多的分区都有对应同一个键的累加器,就需要使用用户提供的mergeCombiners() 方法将各个分区的结果进行合并。

3、RDD分区:

RDD的都有固定数目的分区,分区数决定了在RDD上面执行操作时的并行度。在执行聚合操作或分组操作的时候,可以要求Spark使用给定的分区数。Spark始终尝试根据集群的大小来推算一个有意义的默认值,但是有时候需要你自己对并行度进行调整来获取到更好的性能表现。对于除了分组和聚合操作之外,我们还想改变RDD的分区,可以通过repartition()函数,函数会进行网络数据混洗,并创建出新的分区。、

4、使用partitionBy()函数需要进行持久化

使用partitionBy()函数需要进行持久化,不进行持久化的话,后面每次使用到这个RDD都会进行重新分区,导致整个RDD谱系重新计算,抵消partitionBy()分区带来的好处。RDD一旦被创建即不可修改,只能创建出新的RDD。Spark的许多操作都引入了将数据根据键跨节点进行混洗的过程。所有这些操作都会从分区中进行收益。就Spark1.0而言,收益的操作有groupWith(),cogroup(),join(),leftOuterJoin(),groupByKey(),reduceByKey(),CombineByKey()以及loopup()。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Apache Spark