Scala 如何将rdd划分为特定数量的rdd

Scala 如何将rdd划分为特定数量的rdd,scala,apache-spark,rdd,Scala,Apache Spark,Rdd,我有以下从文本文件生成RDD的代码: val data = sparkContext.textfile(path) val k = 3 如何将数据划分为k个唯一RDD? 您可以使用它根据参数中传递的权重划分现有RDD,并返回RDD数组 内部工作如下所示 /** * Randomly splits this RDD with the provided weights. * * @param weights weights for splits, will be normalized i

我有以下从文本文件生成RDD的代码:

val data = sparkContext.textfile(path)
val k = 3 
如何将数据划分为k个唯一RDD?

  • 您可以使用它根据参数中传递的权重划分现有RDD,并返回RDD数组
内部工作如下所示

/**
 * Randomly splits this RDD with the provided weights.
 *
 * @param weights weights for splits, will be normalized if they don't sum to 1
 * @param seed random seed
 *
 * @return split RDDs in an array
 */
def randomSplit(weights: Array[Double], seed: Long = Utils.random.nextLong): Array[RDD[T]] = {
  require(weights.forall(_ >= 0),
    s"Weights must be nonnegative, but got ${weights.mkString("[", ",", "]")}")
  require(weights.sum > 0,
    s"Sum of weights must be positive, but got ${weights.mkString("[", ",", "]")}")

  withScope {
    val sum = weights.sum
    val normalizedCumWeights = weights.map(_ / sum).scanLeft(0.0d)(_ + _)
    normalizedCumWeights.sliding(2).map { x =>
    randomSampleWithRange(x(0), x(1), seed)
  }.toArray
}
注意:如果拆分的权重总和不等于1,则将对其进行归一化处理

基于上述行为,我创建了一个示例代码段,如下所示:

打电话的人会说

val rddWithNumParts : Array[RDD] = yourRDD.randomSplit(getDoubleWeights(yourRDD.partitions.length))
这将统一划分为RDD的数量

注:同样适用于以下
数据帧。randomSplit

  • 您还可以通过将schema指定给
    RDD
    并使用下面的示例将其转换为
    Dataframe

    sqlContext.createDataFrame(rddOfRow,Schema)
以后可以调用此方法

DataFrame[]randomSplit(双[]权重)随机拆分此 具有提供的权重的数据帧

  • 我的另一个想法是根据分区数进行划分
i、 e
RDD.mapPartitionWithIndex(..)


对于每个分区,您都有一个迭代器(可以转换为RDD)。您可以有一些东西,如分区数=rdd数

权重之和大于1,则它将等分它们作为规范化的一部分使用
rdd.partitions.length
作为权重如果总和大于1,则它将自动规范化并等分为相等数量的权重。我也这样做了。我的答案应该是这样的:如果拆分的权重总和不等于1,那么将对权重进行规范化。如果可以将rdd拆分为相同的大小,这意味着,例如,如果记录数为12,对于k=3,则每个rdd有4条记录
val rddWithNumParts : Array[RDD] = yourRDD.randomSplit(getDoubleWeights(yourRDD.partitions.length))