Scala 如何使用RDD创建RDD集合?
我有一个Scala 如何使用RDD创建RDD集合?,scala,apache-spark,Scala,Apache Spark,我有一个RDD[String],wordRDD。我还有一个从字符串/单词创建RDD[String]的函数。我想为wordRDD中的每个字符串创建一个新的RDD。以下是我的尝试: 1) 失败,因为Spark不支持嵌套RDD: var newRDD = wordRDD.map( word => { // execute myFunction() (new MyClass(word)).myFunction() }) 2) 失败(可能是由于范围问题): 我在这里发现了一个相关的问题:,
RDD[String]
,wordRDD
。我还有一个从字符串/单词创建RDD[String]的函数。我想为wordRDD
中的每个字符串创建一个新的RDD。以下是我的尝试:
1) 失败,因为Spark不支持嵌套RDD:
var newRDD = wordRDD.map( word => {
// execute myFunction()
(new MyClass(word)).myFunction()
})
2) 失败(可能是由于范围问题):
我在这里发现了一个相关的问题:,但它没有解决我的问题。您不能从另一个
RDD
中创建RDD
但是,可以将函数myFunction:String=>RDD[String]
重写为另一个函数modifiedFunction:String=>Seq[String]
,这样就可以在RDD中使用它。这样,它也将在集群上并行执行。使用modifiedFunction
只需调用wordRDD.flatMap(modifiedFunction)
即可获得所有单词的最终RDD
关键点是使用flatMap
(到map
和展平
转换):
def main(参数:数组[字符串]){
val sparkConf=new sparkConf().setAppName(“Test”).setMaster(“local[*]”)
val sc=新的SparkContext(sparkConf)
val输入=sc.parallelize(顺序(“苹果”、“安娜”、“香蕉”))
//RDD(“PPE”、“aple”、“nanas”、“anana”、“bnana”等)
val结果=input.flatMap(modifiedFunction)
}
def modifiedFunction(字:字符串):Seq[String]={
单词索引图{
index=>word.substring(0,index)+word.substring(index+1)
}
}
使用
flatMap
获得所需的RDD[String]
var allWords = wordRDD.flatMap { word =>
(new MyClass(word)).myFunction().collect()
}
这应该如何并行运行?在
wordRDD.map
中发生的所有事情都在集群上执行。因此,内部collect
必须从正在运行的作业中触发新的Spark作业。我怀疑它不会分布式运行。他也可以更改函数以返回数组而不是RDD,但问题没有指定实际的函数。但他的描述说他有一个函数,我假设是myFunction
从字符串/单词创建了RDD[String]
。是的。您的答案告诉他更改myFunction
以返回不同的内容。在不知道函数有多复杂的情况下,很难说在函数中进行的计算是分布式的还是非分布式的。如果收集数据集意味着以前完成的所有计算都不再分发,那么就不会分发任何内容。我不知道你所说的“发送”是什么意思,但我已经运行了我最初发布的代码。成功了@JacekLaskowski使我的代码更加紧凑,但我认为它仍然有效。
// 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',...)
var allWords = wordRDD.flatMap { word =>
(new MyClass(word)).myFunction().collect()
}