嗨,我是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")
})
答案 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] //但是需要进行转换。