Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 如何使用RDD创建RDD集合?_Scala_Apache Spark - Fatal编程技术网

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()
}