Как безопасно выполнить операцию getAs в строке данных искры? - PullRequest
0 голосов
/ 29 ноября 2018

У меня есть следующий фрейм данных:

val df = Seq(("x", "y", 1),("x", "z", 2),("x", "a", 4), ("x", "a", 5), ("t", "y", 1), ("t", "y2", 6), ("t", "y3", 3), ("t", "y4", 5)).toDF("F1", "F2", "F3")


+---+---+---+
| F1| F2| F3|
+---+---+---+
|  x|  y|  1|
|  x|  z|  2|
|  x|  a|  4|
|  x|  a|  5|
|  t|  y|  1|
|  t| y2|  6|
|  t| y3|  3|
|  t| y4|  5|
+---+---+---+

Я выполняю фильтрацию и выбор значений следующим образом:

df.filter($"F1" === "x" && $"F2"==="y").head.getInt(2)

Вышеописанное работает.Но получим исключение из следующего:

df.filter($"F1" === "x" && $"F2"==="y").head.getDouble(2)

Кроме того, следующие разрывы, когда в отфильтрованном фрейме данных нет записей:

df.filter($"F1" === "x" && $"F2"==="y1").head.getAs[Int]("F3")

Итак, как безопасно выполнить getAs[]()и получить значение?Если значение является целым или двойным, я хочу, чтобы оно всегда было двойным, а если отфильтрованный фрейм данных пуст, то должен быть возвращен 0.0.

1 Ответ

0 голосов
/ 29 ноября 2018

Не используйте динамический API вообще, а голову вообщеИспользуйте строго типизированный API и типы приведения явно:

import org.apache.spark.sql.DataFrame

def get(df: DataFrame) = df.select($"F3".as[Double])
  .take(1).headOption.getOrElse(0.0)

Пример использования:

get(df.filter($"F1" === "x" && $"F2"==="y"))
//  Double = 1.0

get(df.filter($"F1" === "x" && $"F2"==="y1"))
// Double = 0.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...