如何在给定每个 RDD 的最大行数且不使用 ID 列的情况下将 RDD 拆分为多个(较小的)RDD

How to split an RDD into multiple (smaller) RDDs given a max number of rows per RDD, and without using an ID column

已经有人问过类似的问题。 最相似的是这个: Spark: How to split an RDD[T]` into Seq[RDD[T]] and preserve the ordering

但是,我不关心保留顺序。此外,我在数据中没有任何 ID 列。我最关心的是每一行数据只写入一个新的RDD一次!出于这个原因,我不能使用 randomSplit,尽管我期待这样一个简单的解决方案。遍历分区的sparkContext也不行。

我理解将一个 RDD 拆分为多个 RDD 没有任何意义,因为 RDD 已经可以跨多个集群进行处理(因此会自动拆分)。

但是,根据高度复杂的业务逻辑,拆分 RDD 是一项要求,我需要用它来实现 spark 代码,我不能以任何其他方式实现它。

我的解决方案是 select 从一个大的 RDD 中提取范围,然后简单地将每个范围放入一个新的 RDD 中。但是,这看起来是一项耗时的任务,因此不是一个好的解决方案。

如果有人能帮助我,并将其保持在初学者水平,我将不胜感激。

对我有用的解决方案:

val numberOfRows = 10000

indexedRDD = RDD.zipWithIndex

for (FROM <-1 to numOfPartitions){
val tempRDD = indexedRDD.filter(from=> {from._2>from && from._2 < from+numberOfRows}).map(from=>from._1)
}

你能使用其中一列的数据并根据它进行过滤吗?

您还可以制作一个带有 mapPartitionsWithIndex 的程序,该程序将从每个分区中获取前 n 行用于第一个 RDD,然后再次 mapPartitionsWithIndex 并将其余行用于第二个 RDD。 如果您需要确切的行数,那么您需要在那里做一些数学运算,但可以做到。