读取实木复合地板文件,并尝试使用此行将数据帧转换为Map [String,Double]:
df.map(r => (r(0).toString, r(1).toDouble.getOrElse(0))).collect().toMap
我得到这个错误:
error: value toDouble is not a member of Any
这对我完全没有意义。我究竟做错了什么?我创建了数据框,因此无论在哪一列中都没有空值或不正确的类型-也许我应该以不同的方式读取镶木地板文件,以使列不是Option?
这也会导致相同的错误:
df.map(r => (r(0).toString, r.get(r(1).toDouble).getOrElse(0))).collect().toMap
这确实有效,而且我不理解 at all 为什么会这样:
df.map(r => (r(0).toString, r(1).toString.toDouble)).collect().toMap
有人知道引擎盖下发生了什么吗?
答案 0 :(得分:2)
我建议将Row
方法getAs[T]与na.fill函数一起使用,如下所示:
import spark.implicits._
val df = Seq(
("a", Some(1.0)), ("b", None), ("c", Some(3.0))
).toDF("c1", "c2")
df.show
// +---+----+
// | c1| c2|
// +---+----+
// | a| 1.0|
// | b|null|
// | c| 3.0|
// +---+----+
df.
na.fill(0.0, Seq("c2")).
map(r => (r.getAs[String](0), r.getAs[Double](1))).
collect.toMap
// res1: scala.collection.immutable.Map[String,Double] = Map(a -> 1.0, b -> 0.0, c -> 3.0)