Spark Scala: Почему я получаю ошибку опции, когда я указываю getOrElse? - PullRequest
0 голосов
/ 07 апреля 2019

Чтение файла паркета и попытка преобразовать фрейм данных в карту [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

Кто-нибудь знает, что происходит под капотом?

1 Ответ

2 голосов
/ 07 апреля 2019

Я бы предложил использовать 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...