Scala 循环内的RDD转换
所以我有一个名为Adat的rdd:Array[String],我想在一个循环中对它进行转换,得到一个新的rdd,我可以在循环范围之外使用它。我尝试了这个方法,但结果不是我想要的Scala 循环内的RDD转换,scala,apache-spark,rdd,Scala,Apache Spark,Rdd,所以我有一个名为Adat的rdd:Array[String],我想在一个循环中对它进行转换,得到一个新的rdd,我可以在循环范围之外使用它。我尝试了这个方法,但结果不是我想要的 val sharedA = { for { i <- 0 to shareA.toInt - 1 j <- 0 to shareA.toInt - 1 } yield { Adat.map(x => (x(1).toInt, i % shareA.toInt, j
val sharedA = {
for {
i <- 0 to shareA.toInt - 1
j <- 0 to shareA.toInt - 1
} yield {
Adat.map(x => (x(1).toInt, i % shareA.toInt, j % shareA.toInt, x(2)))
}
}
如何将sharedA转换为RDD[(Int,Int,Int,String)]
如果我这样做,sharedA有正确的数据类型,但我不能在范围之外使用它
for { i <- 0 to shareA.toInt -1
j<-0 to shareA.toInt-1 }
yield {
val sharedA=Adat.map(x => (x(1).toInt,i % shareA.toInt ,j %
shareA.toInt,x(2)))
}
对于{i我不完全理解你的描述,但是flatMap
应该可以做到:
val rdd = sc.parallelize(Seq(Array("", "0", "foo"), Array("", "1", "bar")))
val n = 2
val result = rdd.flatMap(xs => for {
i <- 0 to n
j <- 0 to n
} yield (xs(1).toInt, i, j, xs(2)))
result.take(5)
// Array[(Int, Int, Int, String)] =
// Array((0,0,0,foo), (0,0,1,foo), (0,0,2,foo), (0,1,0,foo), (0,1,1,foo))
我不明白你的代码有什么意义:(代码< > %%Sule.ToT> <代码> j%sAuth.ToT<<代码>应该是简单地等于<代码> i>代码>和<>代码> j>代码>是唯一的更改元素。你能提供示例输入和预期输出吗?SHARCH已经计算出来了,把它看作是一个小整数,但它并不重要,让我们在开始HAV时说RDD ADAT。e一些用逗号分隔的数据,在循环的帮助下,我想使用i和j添加更多的数据,我想得到一个新的RDD的结果,我可以在范围之外使用它。
val rdd = sc.parallelize(Seq(Array("", "0", "foo"), Array("", "1", "bar")))
val n = 2
val result = rdd.flatMap(xs => for {
i <- 0 to n
j <- 0 to n
} yield (xs(1).toInt, i, j, xs(2)))
result.take(5)
// Array[(Int, Int, Int, String)] =
// Array((0,0,0,foo), (0,0,1,foo), (0,0,2,foo), (0,1,0,foo), (0,1,1,foo))
val resultViaUnion = sc.union(for {
i <- 0 to n
j <- 0 to n
} yield rdd.map(xs => (xs(1).toInt, i, j, xs(2))))
resultViaUnion.take(5)
// Array[(Int, Int, Int, String)] =
// Array((0,0,0,foo), (1,0,0,bar), (0,0,1,foo), (1,0,1,bar), (0,0,2,foo))