Сбор двух значений из DataFrame и использование их в качестве параметров для класса наблюдения;ищет менее подробное решение - PullRequest
0 голосов
/ 09 марта 2019

У меня есть некоторые данные в spark, result: DataFrame = ..., где интерес представляют два целых столбца;week и year.Значения этих столбцов идентичны для всех строк.

Я хочу извлечь эти два целочисленных значения и передать их в качестве параметров для создания WeekYear:

case class WeekYear(week: Int, year: Int)

Ниже приведен мойтекущее решение, но я думаю, что должен быть более элегантный способ сделать это.Как это можно сделать без промежуточного шага создания temp?

val temp = result
  .select("week", "year")
  .first
  .toSeq
  .map(_.toString.toInt)

val resultWeekYear = WeekYear(temp(0), temp(1))

1 Ответ

2 голосов
/ 09 марта 2019

Лучший способ использовать case class с кадрами данных - это разрешить Spark преобразовывать его в набор данных с помощью метода .as(). Пока ваш класс case имеет атрибуты, которые соответствуют всем именам столбцов, он должен работать очень легко.

case class WeekYear(week: Int, year: Int)
val df = spark.createDataset(Seq((1, 1), (2, 2), (3, 3))).toDF("week", "year")
val ds = df.as[WeekYear]
ds.show()

, который обеспечивает Dataset[WeekYear], который выглядит следующим образом:

+----+----+
|week|year|
+----+----+
|   1|   1|
|   2|   2|
|   3|   3|
+----+----+

Вы можете использовать некоторые более сложные вложенные классы, но для этого вы должны начать работать с Encoders, чтобы искра знала, как конвертировать туда и обратно.

Spark делает некоторые неявные преобразования, поэтому ds может по-прежнему выглядеть как Dataframe, но на самом деле это строго типизированный Dataset[WeekYear] вместо Dataset[Row] с произвольными столбцами. Вы оперируете им аналогично RDD. Затем просто возьмите .first() один из них, и вы уже получите нужный вам тип.

val resultWeekYear = ds.first
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...