我应该使用对象类还是广播变量

时间:2019-04-29 19:59:23

标签: scala apache-spark

我有一个坐标RDD [(Int,Int)],我想创建一个新的RDD [(Int,(Int,Int))]最佳实践是什么?

object GlobalVariables{

  private var pointId : Int = 0

  def newPointId(): Long ={
    pointId += 1
    pointId
  }

}

points = coordinates.map(x=> (GlobalVariables.newPointID,x._1, x._2))
  1. 此代码是在工作程序上执行的还是应该结合使用广播变量和累加器?

  2. 如果代码是在worker上执行的,如何确定我不会出现任何并发错误?

1 个答案:

答案 0 :(得分:0)

您可以尝试另一种解决方案,而无需使用可变计数器。转换zipWithIndex提供了稳定的索引编制,以其原始顺序对每个元素进行编号。 例子:

val myRdd = RDD(1,2,3)
val zippedWithIndex = myRdd.zipWithIndex //  ((1,0),(2,1),(3,2))

第一次转换后,您可以翻转索引和值

val result = zippedWithIndex.map{case (index,value) => (value,index)}  // ((0,1),(1,2),(2,3))