Scala 如何将一个随机rdd连接到另一个rdd?

Scala 如何将一个随机rdd连接到另一个rdd?,scala,apache-spark,join,rdd,Scala,Apache Spark,Join,Rdd,我有一个字符串的RDD,但可以是任何我想用随机法线的RDD进行内部连接的东西。我知道这可以通过在两个rdd上使用.zipWithIndex来解决,但这似乎不能很好地扩展,有没有一种方法可以使用来自另一个rdd或其他更快的方法的数据初始化随机rdd?以下是我对zipWithIndex所做的操作: 一般来说,我不会担心zipWithIndex。虽然它需要额外的行动,但它属于相对廉价的业务。然而,加入是另一回事 由于矢量内容不依赖于其他RDD的值,因此就地生成矢量内容更有意义。您所要做的就是模拟随机R

我有一个字符串的RDD,但可以是任何我想用随机法线的RDD进行内部连接的东西。我知道这可以通过在两个rdd上使用.zipWithIndex来解决,但这似乎不能很好地扩展,有没有一种方法可以使用来自另一个rdd或其他更快的方法的数据初始化随机rdd?以下是我对zipWithIndex所做的操作:


一般来说,我不会担心zipWithIndex。虽然它需要额外的行动,但它属于相对廉价的业务。然而,加入是另一回事

由于矢量内容不依赖于其他RDD的值,因此就地生成矢量内容更有意义。您所要做的就是模拟随机RDDS逻辑:


zipWithIndex不是问题,但你为什么要加入?如果它是随机的,您可以在地图中添加向量。@user6910411,我不确定我是否理解您的评论,但它听起来确实像是对我问题的回答。也许写下这段代码作为答案,我会看看它是否解决了问题?
import org.apache.spark.mllib.random.RandomRDDs
import org.apache.spark.rdd.RDD

val numExamples = 10 // number of rows in RDD 
val maNum   = 7
val commonStdDev   = 0.1 // common standard deviation 1/10, makes variance = 0.01
val normalVectorRDD = RandomRDDs.normalVectorRDD(sc, numRows = numExamples, numCols = maNum) 
val rescaledNormals = normalVectorRDD.map{myVec => myVec.toArray.map(x => x*commonStdDev)}
  .zipWithIndex
  .map{case (key,value) => (value,(key))} 

val otherRDD = sc.textFile(otherFilepath)
  .zipWithIndex
  .map{case (key,value) => (value,(key))} 

val joinedRDD = otherRDD.join(rescaledNormals).map{case(key,(other,dArray)) => (other,dArray)}
import org.apache.spark.mllib.random.StandardNormalGenerator 
import org.apache.spark.ml.linalg.DenseVector  // or org.apache.spark.mllib

val vectorSize = 42
val stdDev = 0.1
val seed = scala.util.Random.nextLong  // Or set manually

// Define seeds for each partition
val random = new scala.util.Random(seed)
val seeds = (0 until otherRDD.getNumPartitions).map(
  i => i -> random.nextLong
).toMap

otherRDD.mapPartitionsWithIndex((i, iter) => {
  val generator = new StandardNormalGenerator()
  generator.setSeed(seeds(i))
  iter.map(x => 
    (x, new DenseVector(Array.fill(vectorSize)(generator.nextValue() * stdDev)))
  )
})