如何将rdd除以特定的rdd数

时间:2017-10-25 05:28:18

标签: scala apache-spark rdd

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

val data = sparkContext.textfile(path)
val k = 3 

如何将数据划分为k个唯一的RDD?

1 个答案:

答案 0 :(得分:3)

  • 您可以使用RDD.randomSplit根据参数中传递的权重划分现有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 ,则会标准化

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

def getDoubleWeights(numparts:Int) : Array[Double] = {
  Array.fill[Double](numparts)(1.0d)
}
打电话的人会像....

val rddWithNumParts : Array[RDD] = yourRDD.randomSplit(getDoubleWeights(yourRDD.partitions.length))

这将统一划分为RDD的数量

  

注意:同样适用于DataFrame.randomSplit以下

  • 您也可以通过向Dataframe提供架构并将其转换为RDD,并使用如下示例..
    sqlContext.createDataFrame(rddOfRow, Schema)

以后你可以调用这个方法。

  

DataFrame [] randomSplit(double []权重)随机拆分   DataFrame提供的权重。

  • 我的其他想法是根据分区数量来划分......

RDD.mapPartitionWithIndex(....)

对于每个分区,您有一个Iterator(可以转换为RDD)。你可以有一些像分区数= RDD数