Ho un RDD[String]
, wordRDD
. Ho anche una funzione che crea un RDD [String] da una stringa/parola. Vorrei creare un nuovo RDD per ogni stringa in wordRDD
. Qui sono i miei tentativi:Come creare la raccolta di RDD da RDD?
1) non è riuscita perché Spark non supporta RDDs nidificate:?
var newRDD = wordRDD.map(word => {
// execute myFunction()
(new MyClass(word)).myFunction()
})
2) non è riuscita (forse a causa di problema di portata):
var newRDD = sc.parallelize(new Array[String](0))
val wordArray = wordRDD.collect
for (w <- wordArray){
newRDD = sc.union(newRDD,(new MyClass(w)).myFunction())
}
Il mio risultato ideale sarebbe simile:
// input RDD (wordRDD)
wordRDD: org.apache.spark.rdd.RDD[String] = ('apple','banana','orange'...)
// myFunction behavior
new MyClass('apple').myFunction(): RDD[String] = ('pple','aple'...'appl')
// after executing myFunction() on each word in wordRDD:
newRDD: RDD[String] = ('pple','aple',...,'anana','bnana','baana',...)
ho trovato qui una domanda rilevante: Spark when union a lot of RDD throws stack overflow error, ma non ha affrontato la mia problema.
Come si suppone debba funzionare in parallelo? Tutto ciò che accade all'interno di 'wordRDD.map' viene eseguito sul cluster. Pertanto, il 'collect' interno deve attivare un nuovo lavoro Spark da un lavoro in esecuzione. Sospetto che non funzionerà in modo distribuito. –
Poteva anche modificare la funzione per restituire gli array anziché gli RDD, ma la domanda non specificava la funzione effettiva. –
Ma la sua descrizione dice che ha una funzione, presumo che sia 'myFunction' che crea un' RDD [String] 'da una stringa/parola. –