尝试投射坐标矩阵时抛出异常

时间:2018-08-23 11:27:09

标签: scala apache-spark rdd

嗨,我是Scala和Spark的新手。我正在编写测试以检查数据的完整性。为此,我有一个协调矩阵,并将其与ResultMap映射。现在在我的测试方法中,我需要从结果映射中获取它,并将类型隐式转换为Coordinate,从而在线程中引发异常 “主要” java.lang.ClassCastException:scala。某些不能转换为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")
         })

2 个答案:

答案 0 :(得分:1)

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

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

如果确定映射包含键,则可以通过使用map(key)直接访问元素,而不必使用.get。如果未为地图定义键,这将直接为您提供元素,但会引发异常。

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

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

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

答案 1 :(得分:0)

我在@ crater2150的帮助下做到了这一点
 val matrix = map(“ MatrixEntries”)。asInstanceOf [CoordinateMatrix] //但是需要进行转换。