Scala中的Foreach死锁

时间:2017-07-09 14:07:06

标签: scala apache-spark foreach deadlock bigdata

我在foreach操作中遇到了一些问题:程序永远不会完成,并且它就像在这一行上陷入僵局一样。

这是程序所依赖的代码行,我将为rddData的每个元素打印rddUserData的第一个元素:

  rddUserData.foreach( r => println(trasformToIndexed().lookup(0)(0)._2.toDouble))

这是函数trasformToIndex

的代码
  def trasformToIndexed(): RDD[(Long, ((String, String), Int))] = {
      val withIndex = rddData.zipWithIndex()
      val indexKey = withIndex.map{case (k,v) => (v,k)}
      indexKey
  }

我也尝试过这种方式,不使用zipWithIndex,但将rdd转换为列表然后获取第一个元素,但它也不起作用:

 rddUserData.foreach( r => println(rddData.collect().toList(0)._2).toDouble)

实现目标的唯一方法是遍历rddUserDatafor statement并执行相同的操作。

val listReaction = rddUserData.collect().toList
for(i<-0 to listReaction.size-1){
  println(println(rddData.collect().toList(0)._2).toDouble)
}

但是,我想用foreach声明来解决它。

1 个答案:

答案 0 :(得分:0)

我的问题是rddData foreach rddUserDatarddData的访问权限。 显然,这在闭包内是不可能的。

无论如何,我在这里发布我的解决方案:

  1. 我为foreach;
  2. 创建了一张地图
  3. 我在{{1}}。
  4. 中访问过它
    val map = rddData.collect().toMap
    rddUserData.foreach( println(rddData.get("someKey")).toDouble)
    

    get函数返回Some对象,因此需要打开它。