我有一段像这样的火花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)
为什么?
答案 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]