Mam RDD[String]
, wordRDD
. Mam również funkcję, która tworzy RDD [String] z ciągu/słowa. Chciałbym stworzyć nowy RDD dla każdego ciągu w wordRDD
. Oto moje próby:Jak utworzyć kolekcję RDD z RDD?
1) nie powiodło się, ponieważ Spark nie obsługuje zagnieżdżone RDD:
var newRDD = wordRDD.map(word => {
// execute myFunction()
(new MyClass(word)).myFunction()
})
2) nie powiodło się (prawdopodobnie z powodu kwestii zakresu):
var newRDD = sc.parallelize(new Array[String](0))
val wordArray = wordRDD.collect
for (w <- wordArray){
newRDD = sc.union(newRDD,(new MyClass(w)).myFunction())
}
Mój idealny wynik byłby wyglądać następująco:
// 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',...)
znalazłem odpowiednie pytanie tutaj: Spark when union a lot of RDD throws stack overflow error, ale to nie mój adres kwestia.
Jak to ma działać równolegle? Wszystko, co dzieje się wewnątrz 'wordRDD.map', jest wykonywane w klastrze. Zatem wewnętrzny 'collect' musi wywołać nowe zadanie Sparka z działającego zadania. Podejrzewam, że nie będzie działał w sposób rozproszony. –
Mógłby także zmienić funkcję zwracania tablic zamiast RDD, ale pytanie nie określało rzeczywistej funkcji. –
Ale jego opis mówi, że ma on funkcję, zakładam, że jest to 'myFunction', która tworzy' RDD [String] 'z ciągu/słowa. –