spark transform系列__Cartesian

本文详细介绍了Apache Spark中RDD的笛卡尔集操作原理。重点解释了如何通过CartesianRDD实现两个RDD之间的笛卡尔积运算,包括分区数的计算方式及数据组合过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Cartesian

这个操作返回两个RDD的笛卡尔集.如果两个RDD中某一个RDD的结果集为空集时,这个结果集也是一个空集.

这个操作不会执行shuffle的操作.

def cartesian[U: ClassTag](other: RDD[U]): RDD[(TU)] = withScope {
  new CartesianRDD(scthisother)
}

从上面的代码中,可以看出,直接生成了一个CartesianRDD的实例.

这个实例的关键部分:

override def getPartitions: Array[Partition] = {

这个CartesianRDD的Partition的个数是要做笛卡尔集的上层两个RDD的partition的个数的乘积.
  // create the cross product split
  val array = new Array[Partition](rdd1.partitions.length * rdd2.partitions.length)
  for (s1 <- rdd1.partitionss2 <- rdd2.partitions) {
    val idx = s1.index * numPartitionsInRdd2 + s2.index
    array(idx) = new CartesianPartition(idxrdd1rdd2s1.indexs2.index)
  }
  array
}

这里,按第一个RDD的结果集为基准结果集,对两个RDD中各partition的结果进行组合.类似于join.但不通过key进行组合,而是通过partition进行组合.下面代码的for是两层迭代.也就是说rdd1中每个partition的结果集中,都包含有rdd2中所有的partition的结果集.

override def compute(split: Partitioncontext: TaskContext): Iterator[(TU)] = {
  val currSplit = split.asInstanceOf[CartesianPartition]
  for (x <- rdd1.iterator(currSplit.s1context);
       y <- rdd2.iterator(currSplit.s2context)) yield (xy)
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值