构建spatialRDD
基于key-value形式的RDD生成SpatialRDD
类SpatialRDD继承自spark-core的RDD
伴生对象SpatialRDD调用updatable函数对k-v RDD进行构造。其中对重复key进行了任意合并,具体怎么实现呢???定义了函数z和f,而函数z和f在elems上的应用则是在再次调用的updatable中定义,该现象为scala高阶函数2中的一个函数作为另一个函数的参数
1 | /** |
在对key-valueRDD进行数据切割的时候,重新定义了一个分区函数QtreePartitioner,类似于spark原生的HashPatitionner
(哈希分区)和RangePatitioner
(区域分区),既决定了RDD本身的分区数量,也可以作为其父RDD Shuffle输出(MapOutput)中每个分区进行数据切割的依据。
新的分区函数QtreePartitioner
Spark内部提供了HashPartitioner
和RangePartitioner
两种分区策略,这两种分区策略在很多情况下都适合我们的场景。但是有些情况下,Spark内部不能符合需求,这时候就可以自定义分区策略。为此,Spark提供了相应的接口,我们只需要扩展Partitioner
抽象类,然后实现里面的三个方法:
1 | package org.apache.spark |
def numPartitions: Int
:这个方法需要返回你想要创建分区的个数;def getPartition(key: Any): Int
:这个函数需要对输入的key做计算,然后返回该key的分区ID,范围一定是0到numPartitions-1
,分区ID相同的数据元素将被分配到同一个数据分片中;equals()
:这个是Java标准的判断相等的函数,之所以要求用户实现这个函数是因为Spark内部会比较两个RDD的分区是否一样。Spark自定义分区(Partitioner)
1 | val quadtree: QtreeForPartion = { |
Spark自定义分区(Partitioner). https://www.iteblog.com/archives/1368.html ↩