Spark Scala:为什么在指定getOrElse时出现选项错误?

时间:2019-04-07 18:42:58

标签: scala apache-spark dataframe dictionary option

读取实木复合地板文件,并尝试使用此行将数据帧转换为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

有人知道引擎盖下发生了什么吗?

1 个答案:

答案 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)