У меня есть набор данных со столбцами 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, каждый из которых содержит только строки исходного кадра данных длямесяц в их названии