Scala 对我的RDD的所有元素对执行一个函数

Scala 对我的RDD的所有元素对执行一个函数,scala,apache-spark,rdd,Scala,Apache Spark,Rdd,我将试着用一般的方式问这个问题 我有一个这样的函数 myFunction (Object first, Object second) 我有一个对象的rddrdd[Object] 我需要在所有rdd的元素上执行myFunction,在过程结束时,我必须确保我的对象的所有对都是用myFunction(…..)执行的 一种可能的方法是创建一个广播变量(作为我的RDD的副本),然后 val broadcastVar = sc.broadcast(rdd.collect()) rdd_line.m

我将试着用一般的方式问这个问题

我有一个这样的函数

 myFunction (Object first, Object second)
我有一个对象的rdd
rdd[Object]

我需要在所有rdd的元素上执行myFunction,在过程结束时,我必须确保我的对象的所有对都是用myFunction(…..)执行的

一种可能的方法是创建一个广播变量(作为我的RDD的副本),然后

 val broadcastVar = sc.broadcast(rdd.collect())
 rdd_line.mapPartitions(p=> {
   var brd = broadcastVar.value
   var result = new ListBuffer[Double]()
   brd.foreach(b => {
     p.foreach(e => result+= myfunction(b ,e))
   })
   result.toList.toIterator
 })

还有另一种方法可以更好地实现这一点吗

使用RDD的
.cartesian
方法获得一个RDD,该RDD包含两个元素的所有元素对。在这种情况下,您需要RDD的笛卡尔坐标系:

rdd.cartesian(rdd).map({ case (x, y) => myFunction(x, y) })

注意,这将包括一个元素自身的成对,以及两个顺序的成对,即(a,b)和(b,a)。和(a,a)。

使用RDD的
.cartesian
方法获得一个RDD,其中包含两个元素中的所有元素对。在这种情况下,您需要RDD的笛卡尔坐标系:

rdd.cartesian(rdd).map({ case (x, y) => myFunction(x, y) })

注意,这将包括一个元素自身的成对,以及两个顺序的成对,即(a,b)和(b,a)。和(a,a)。

对整个大数据对象调用collect以再次修改/广播它通常是一种反模式。相反,使用Spark map、reduce、filter或类似的方法来转换大数据对象。调用整个大数据对象上的collect以再次修改/广播它通常是一种反模式。相反,使用火花贴图、reduce、filter或类似的方法来转换大数据对象。