【问题标题】:Cast Exception When trying to cast a Coordinate Matrix尝试投射坐标矩阵时出现投射异常
【发布时间】:2018-08-23 21:11:50
【问题描述】:

您好,我对 Scala 和 Spark 非常陌生。我正在编写一个测试来检查我的数据的完整性。为此,我有一个坐标矩阵,并用 ResultMap 映射它。现在在我的测试方法中,我需要从结果映射中获取它并将类型转换为坐标它在线程中引发了一个异常 "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")
         })

【问题讨论】:

    标签: scala apache-spark rdd


    【解决方案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 class TestData(matrixEntries: CoordinateMatrix /* further elements here */)
    // ...
    val matrix = testData.matrixEntries // no casting required, type errors checked at compile time
    

    【讨论】:

    • 我有另一个值要映射到结果所以我不确定这是否是一个好方法?
    • getOrElse 不起作用,它显示以下错误值条目不是 Any 的成员
    • 如果您保留地图并使用getOrElse,您仍然需要使用asInstanceOf 进行投射,因为地图条目的类型仍然是Any
    • 您能否建议任何文件或链接以阅读有关地图和其他方法的信息。
    【解决方案2】:

    我是在 @crater2150 的帮助下这样做的
    val matrix=map("MatrixEntries").asInstanceOf[CoordinateMatrix] // 但是需要转换。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-16
      • 2017-03-17
      • 2013-04-28
      • 2013-08-03
      相关资源
      最近更新 更多