首页 > 解决方案 > 尝试投射坐标矩阵时出现投射异常

问题描述

嗨,我对 Scala 和 Spark 很陌生。我正在编写一个测试来检查我的数据的完整性。为此,我有一个坐标矩阵,并用 ResultMap 映射它。现在在我的测试方法中,我需要从结果映射中获取它并将类型转换为 Coordinate 它在线程“main”java.lang.ClassCastException 中引发了一个异常:scala.Some 无法转换为 org.apache.spark.mllib.linalg .distributed.CoordinateMatrix

这是我的代码。

def SinghTest(map:Map[String,Any ]):Boolean={  
      var res:Boolean=false // false


           val connection= DriverManager.getConnection("Connectionstring ")
       val statement = connection.createStatement();
       val rs = statement.executeQuery("select A,B from Demo P" +
           " join Demo_REL  R on p.id=R.ID " +
           "join Cpu CN on CN.id=R.CID" + 
           " limit 10 ");
        /***
       * Maping with ResultMap
       ***/
       val matrix=map.get("MatrixEntries").asInstanceOf[CoordinateMatrix]

       matrix.entries.take(10).foreach(x=> {

         val ph=x.i
         val ch=x.j
         val pid=rs.getLong(1)
         val cid=rs.getLong(2)
         if((ph!=pid)&&ch!=cid)
           throw new Exception("Fail")
         })

标签: scalaapache-sparkrdd

解决方案


地图上的get方法不直接返回元素,而是其中的一个Option。这意味着,对于Map[String, Any]结果类型是Option[Any]. 选项可以包含一个值或为空;如果您的地图包含键,您将获得Some带有值的 a ,否则为 a None。然后,您可以使用 on 方法对该值进行操作,Option或者通过 获取它getOrElse,如果它是 a ,则使用默认值None

val matrix = map.getOrElse("MatrixEntries", someDefaultMatrix).asInstanceOf[CoordinateMatrix]

如果您确定地图包含键,则可以使用 直接访问元素map(key),只需省略.get. 这将直接为您提供元素,但如果未为您的地图定义键,则会引发异常。

val matrix = map("MatrixEntries").asInstanceOf[CoordinateMatrix]

PS:请注意,使用Any通常被认为是不好的风格,因为它会丢弃任何类型安全性。如果您的地图包含一组大部分固定的键并且您可以控制它的创建(即它不是来自库),请考虑用案例类替换它:

case class TestData(matrixEntries: CoordinateMatrix /* further elements here */)
// ...
val matrix = testData.matrixEntries // no casting required, type errors checked at compile time

推荐阅读