我有以下代码从文本文件生成RDD:
val data = sparkContext.textfile(path)
val k = 3
如何将数据划分为k个唯一的RDD?
答案 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数