读取镶木地板文件并尝试使用以下行将数据框转换为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
对我来说根本没有意义。我究竟做错了什么?我创建了数据框,所以它在任何一列中都没有任何空值或不正确的类型 - 也许我应该以不同方式读取镶木地板文件以使列不是选项?
这也会导致同样的错误:
df.map(r => (r(0).toString, r.get(r(1).toDouble).getOrElse(0))).collect().toMap
然而,这确实有效,我完全不明白它为什么会:
df.map(r => (r(0).toString, r(1).toString.toDouble)).collect().toMap
任何人都知道引擎盖下发生了什么?
我建议使用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)