关于从SQL.DataFrame中获取特殊对象方法

 

1 import spark.implicits._
2 val df1=rdd.map(e=>{
3 a="label"
4 b=Arraybuff[String]("a","b","c")
5 c=Vectors.dense(0.2,0.5,0.6,0.8)
6 (a,b,c)
7 }).toDF("label","features","vector")

当我们想读取df1的vector时我们通过Debug查询发现这个格式是Vector类型,于是想当然就打算通过getAs方法获得该类型
df1.rdd.map(e=>{

 val c=e.getAs("vector")[Vector] 

})

发现虽然格式看起来的确变成Vector,但是你会发现如调用Vectors的Vectors.sqdist()方法时候显示格式Vector格式错误
正确方法应该在getAs方法后加入asInstanceOf方法

df1.rdd.map(e=>{
val c=e.getAs("vector").asInstanceOf[org.apache.spark.ml.linalg.Vector]
val b=e.getAs("features").asInstanceOf[mutable.Seq[Double]]
})

注意:
虽然Debug发现features的格式是Array[Double],但是asInstanceOf[Array[Double]]依旧报错,对此我们可以用

mutable.Seq[Double]来替代[Array[Double]

posted @ 2019-03-08 16:02  ntr亚丝娜  阅读(126)  评论(0)    收藏  举报