这也是一个action算子,并且不会发生shuffle。首先会将多个上游的RDD 放入到一个集合中,或获取所有RDD的分区,判断 是否都定义了分区 并且分区是一样的,如果是则返回PartitionerAwareUnionRDD,否则返回UnionRDD;
PartitionerAwareUnionRDD 是oneToOneDependency 是一个宰依赖,会使用父RDD的分区器
UnionRDD 中会判断RDD的个数是否超过了10个,没超过类似于合并了下分区,这个是自定义的依赖,传过来的依赖关系为Nil;计算依赖关系是使用的RangeDependency 也是一个宰依赖
RDD类
/**
* Return the union of this RDD and another one. Any identical elements will appear multiple
* times (use `.distinct()` to eliminate them).
*/
def union(other: RDD[T]): RDD[T] = withScope {
sc.union(this, other)
}
/** Build the union of a list of RDDs passed as variable-length arguments. */
def union[T: ClassTag](first: RDD[T], rest: RDD[T]*): RDD[T] = withScope {
// TODO:Seq(first) ++ rest先将RDD放入到一个集合中
union(Seq(first) ++ rest)
}
/** Build the union of a list of RDDs. */
def union[T: ClassTag](rdds: Seq[RDD[T]]): RDD[T] = withScope {
// TODO:过滤出 包含分区的rdd
val nonEmptyRdds = rdds.filter(!_