Pair RDD基本操作
虽然大部分Spark的RDD操作都支持所有种类的对象,但是有少部分特殊的操作只能作用于键值对类型的RDD。这类操作中最常见的就是分布的shuffle操作,比如将元素通过键来分组或聚集计算。在Python中,这类操作一般都会使用Python内建的元组类型,比如(1, 2)。生成的键值对的RDD称为PairRDD。
创建Pair RDD
有很多种创建键值对的方式,很多存储键值对的数据格式会在读取时直接返回由其键值对组成的pair RDD。此外当需要将一个普通的RDD转化为一个pair RDD时可以使用map函数来进行操作。
Paste_Image.png
Pair RDD的转化操作
Pair RDD可以使用所有标准RDD上的可用的转化操作。由于pair RDD包含的是二元组,所以需要传递的函数应当操作二元组而不是独立的元素。当然如果传递的函数不是操作二元组的话,有异常报出。
Paste_Image.png
标准转化操作示例:
Paste_Image.png
Pair RDD有一些特有的转化操作如下:
Paste_Image.png
!注意其中对Values进行操作接口所传递的函数参数是rdd中元组的值。
针对两个pair RDD的转化操作:
Paste_Image.png
聚合操作—combineByKey
当数据集以键值对形式组织的时候,聚合具有相同键的元素进行一些统计是很常见的操作。对于Pair RDD常见的聚合操作如:reduceByKey,foldByKey,groupByKey,combineByKey。这里重点要说的是combineByKey。
在数据分析中,处理Key,Value的Pair数据是极为常见的场景,例如我们可以针对这样的数据进行分组、聚合或者将两个包含Pair数据的RDD根据key进行join。从函数的抽象层面看,这些操作具有共同的特征,都是将类型为RDD[(K,V)]的数据处理为RDD[(K,C)]。这里的V和C可以是相同类型,也可以是不同类型。这种数据处理操作并非单纯的对Pair的value进行map,而是针对不同的key值对原有的value进行联合(Combine)。因而,不仅类型可能不同,元素个数也可能不同。
combineByKey函数主要接受了三个函数作为参数,分别为createCombiner、mergeValue、mergeCombiners。这三个函数足以说明它究竟做了什么。理解了这三个函数,就可以很好地理解combineByKey。
要理解combineByKey(),要先理解它在处理数据时是如何处理每个元素的。由于combineByKey()会遍历分区中的所有元素,因此每个元素的键要么还没有遇到过,要么就和之前的键相同。combineByKey()的处理流程如下:
如果是一个新的元素,此时使用createCombiner()来创建那个键对应的累加器的初始值。(!注意:这个过程会在每个分区第一次出现各个键时发生,而不是在整个RDD中第一次出现一个键时发生。)
如果这是一个在处理当前分区中之前已经遇到键,此时combineByKey()使用mergeValue()将该键的累加器对应的当前值与这个新值进行合并。
3.由于每个分区都是独立处理的,因此对于同一个键可以有多个累加器。如果有两个或者更多的分区都有对应同一个键的累加器,就需要使用用户提供的mergeCombiners()将各个分区的结果进行合并。
示例:
Paste_Image.png
作者:LuciferTM
链接:https://www.jianshu.com/p/f3aea4480f2b