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

问题描述 投票:-2回答:1

读取镶木地板文件并尝试使用以下行将数据框转换为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

任何人都知道引擎盖下发生了什么?

scala apache-spark dataframe dictionary option
1个回答
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)
© www.soinside.com 2019 - 2024. All rights reserved.