2014-07-21 10 views
8

Come posso prendere un array di sparkle rdd e dividerlo in due rdds in modo casuale così ogni rdd includerà una parte di dati (diciamo 97% e 3 %).Spark - scala: shuffle RDD/split RDD in due parti casuali in modo casuale

ho pensato di mischiare la lista e poi shuffledList.take((0.97*rddList.count).toInt)

Ma come posso Mescola il RDD?

Oppure c'è un modo migliore per dividere la lista?

+0

sono tutti gli elementi unici Basta chiedersi se si può usare 'takeSample (cioè senza i duplicati?)() 'e quindi filtra il campione dall'elenco originale. – DNA

+0

Può essere duplicato, ma perché è importante, cosa saresti in grado di fare se fossero unici? –

+0

OK, non penso che l'approccio takeSample possa funzionare con i duplicati. – DNA

risposta

19

ho trovato un modo semplice e veloce per dividere la matrice:

val Array(f1,f2) = data.randomSplit(Array(0.97, 0.03)) 

si dividerà i dati utilizzando i pesi previsti.

6

Si dovrebbe usare randomSplit metodo:

def randomSplit(weights: Array[Double], seed: Long = Utils.random.nextLong): Array[RDD[T]] 

// Randomly splits this RDD with the provided weights. 
// weights for splits, will be normalized if they don't sum to 1 
// returns split RDDs in an array 

Ecco la sua implementation scintille 1.0:

def randomSplit(weights: Array[Double], seed: Long = Utils.random.nextLong): Array[RDD[T]] = { 
    val sum = weights.sum 
    val normalizedCumWeights = weights.map(_/sum).scanLeft(0.0d)(_ + _) 
    normalizedCumWeights.sliding(2).map { x => 
     new PartitionwiseSampledRDD[T, T](this, new BernoulliSampler[T](x(0), x(1)),seed) 
    }.toArray 
} 
+0

@Boern Si può sperare che l'altra risposta sia stata modificata in seguito. Se questa risposta è obsoleta, sentiti libero di modificarla. –

Problemi correlati