Получить сумму столбца в DF1 на основе диапазона дат из DF2 в Spark - PullRequest
0 голосов
/ 23 февраля 2020

У меня есть два фрейма данных, и я хочу получить sum из value в фрейме данных 1 на основе диапазона дат от фрейма данных 2 (startDate и endDate) и отсортировать результаты от максимального до минимального в Spark

import org.apache.spark.sql.functions.to_date

val df = sc.parallelize(Seq(
  ("2019-01-01", 100), ("2019-01-02", 150),
  ("2019-01-03", 120), ("2019-01-04", 38),
  ("2019-01-05", 200), ("2019-01-06", 381),
  ("2019-01-07", 220), ("2019-01-08", 183),
  ("2019-01-09", 160), ("2019-01-10", 109),
  ("2019-01-11", 130), ("2019-01-12", 282),
  ("2019-01-13", 10), ("2019-01-14", 348),
  ("2019-01-15", 20), ("2019-01-16", 190)
  )).toDF("date", "value").withColumn("date", to_date($"date"))

val df_dates = sc.parallelize(Seq(
  ("2019-01-01", "2019-01-04"), 
  ("2019-01-05", "2019-01-08"), 
  ("2019-01-09", "2019-01-12"),
  ("2019-01-13", "2019-01-16")
  )).toDF("startDate", "endDate").withColumn("startDate", to_date($"startDate")).withColumn("endDate", to_date($"endDate"))

Полученный результат добавит столбец к df_date фрейму данных sum_value. Я действительно не знаю с чего начать. Я искал в Интернете и не мог найти решение.

1 Ответ

1 голос
/ 23 февраля 2020

Сначала необходимо объединить значения дат в диапазоны дат, а затем агрегировать:

df_dates
  .join(df, $"date".between($"startDate", $"endDate"), "left")
  .groupBy($"startDate", $"endDate").agg(
     sum($"value").as("sum_value")
 )
  .orderBy($"sum_value".desc)
  .show()

+----------+----------+---------+
| startDate|   endDate|sum_value|
+----------+----------+---------+
|2019-01-05|2019-01-08|      984|
|2019-01-09|2019-01-12|      681|
|2019-01-13|2019-01-16|      568|
|2019-01-01|2019-01-04|      408|
+----------+----------+---------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...