spark scala throws java.util.NoSuchElementException:key not found:0 exception

时间:2015-03-26 05:49:38

标签: scala caching apache-spark

我有一段像这样的火花scala代码:

val conf = new SparkConf().setAppName("MatrixInversion").setMaster("local")

val sc = new SparkContext(conf)

  def main (args: Array[String]) {

    var array:Array[Array[Double]]=new Array(2)
    for(i<- 0 until 2)
      array(i)=new Array(2)

    array(0)(0)=1
    array(0)(1)=2
    array(1)(0)=3
    array(1)(1)=4

    sc.makeRDD(array).cache()

    //val matrixA3=sc.textFile("A3")
    testCache()

    sc.stop()

  }

  def testCache():Unit={

    val rdds=sc.getPersistentRDDs
    val cacheArray=rdds(0).asInstanceOf[RDD[Array[Double]]]
    println("print cachaArray")
    cacheArray.collect()
    val cacheLength=cacheArray.collect().length
    println("length"+cacheLength)
  }

现在好了。但是当我取消注释这一行时:val matrixA3=sc.textFile("A3")

有这样的错误:

Exception in thread "main" java.util.NoSuchElementException: key not found: 0
    at scala.collection.MapLike$class.default(MapLike.scala:228)
    at scala.collection.AbstractMap.default(Map.scala:58)
    at scala.collection.MapLike$class.apply(MapLike.scala:141)
    at scala.collection.AbstractMap.apply(Map.scala:58)
    at com.scala.inversion.test$.testCache(test.scala:117)

为什么?

1 个答案:

答案 0 :(得分:2)

您的代码实际上是错误的。

见行

val cacheArray=rdds(0).asInstanceOf[RDD[Array[Double]]]

rdds此处,其类型为scala.collection.Map[Int,org.apache.spark.rdd.RDD[_]]

但是,键( Int )并不总是常量。 (你可以缓存其他事情)。对于您的代码,地图中找不到键== 0

例如,我在计算机中测试了您的代码,rdds

Map(9 -> ParallelCollectionRDD[9]