Ошибка «Рекурсивное значение мне нужен тип» при попытке выполнить несколько операций с условиями в списке - PullRequest
0 голосов
/ 09 октября 2018

У меня есть набор данных со столбцами month, id и value, что-то вроде этого:

val df = Seq(
  (201801, "fghufhg", 3),
  (201801, "bhfbhgf", 6),
  (201801, "dgdjjh", 5),
  (201802, "ehfjrnfj", 6),
  (201802, "ehghghfj", 98),
  (201803, "nfrghj", 75),
  (201803, "nfnrjfj", 7)
).toDF("month", "id", "value")

Я создал нижеприведенную функцию для выбора месяца в своем наборе данных

def selectMonth(input:org.apache.spark.sql.Dataset[org.apache.spark.sql.Row],  col:Column , month:Int) :  org.apache.spark.sql.Dataset[org.apache.spark.sql.Row] = {
  input.where(col === month)
}

Таккогда я делаю это

val month201801 = selectMonth(df, $"month", "201801")

, я получаю фрейм данных (org.apache.spark.sql.DataFrame), содержащий только строки с информацией за этот месяц.

Теперь я хочу найти более простой способ создать несколько таких фреймов данных из списка месяцев, например:

Seq(201801, 201802, 201803, 201804, 201805)

Я хотел сделать что-то вроде приведенного ниже кода, но я явноне думая об этом правильно:

val listCohorts = Seq(201801, 201802, 201803, 201804, 201805) 

for (i <- listCohorts) {
  val (month +i) = selectMonth(df, $"month", i)
}

Потому что я получаю эту ошибку:

notebook:4: error: recursive value i needs type
  val (C +i) = selectMonth(df, $"month", i)
                                         ^
notebook:4: error: not found: value +
  val (C +i) = selectMonth(df, $"month", i)
         ^
notebook:4: error: not found: value C
  val (C +i) = selectMonth(df, $"month", i)
       ^

"Месяц + я" был моей попыткой назвать каждый фрейм данных как month201801, month201802и «i» должен был быть вводом месяца в функции

Другими словами, мне нужен способ создать несколько фреймов данных (org.apache.spark.sql.DataFrame), выполняющихтолько операция where в исходном наборе данных и присвоение ей имени в соответствии с условием, используемым в where.И чтобы иметь возможность адаптировать это (например, выбрать другие месяцы для создания других фреймов данных), изменив только список, который содержит информацию для где.

В Python это будет так просто:

monthlist = ['201801', '201802', '201803']
column = 'month'

for i in monthlist:
    globals()[column + i] = df[df[column] == i]

Это создаст 3 кадра данных с именами month201801, month201802 и month201803, каждый из которых содержит только строки исходного кадра данных длямесяц в их названии

Ответы [ 2 ]

0 голосов
/ 10 октября 2018

Может быть выполнено без отдельной функции, список дат конвертируется в Map с помощью клавиш definec:

val column = "month"
val df = Seq(201801, 201802, 201803, 201804, 201805).toDF(column)

val dates = Seq(201801, 201802, 201803, 201804, 201805)
val monthDfMap = dates.map ( date => column+date -> df.where(col(column)===date)).toMap

val may: org.apache.spark.sql.Dataset[org.apache.spark.sql.Row] = monthDfMap("month201805")
may.show(false)

Вывод:

+------+
|month |
+------+
|201805|
+------+
0 голосов
/ 09 октября 2018

Вы не можете динамически именовать переменные в Scala.Используйте карту вместо.(Карта называется dict в Python.)

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