Нахождение максимальной последовательности в заданном диапазоне - Spark / Scala - PullRequest
2 голосов
/ 19 сентября 2019

Я практикую проблему со Spark, используя Scala, и у меня есть таблица футбольной лиги со столбцами (teamname, lastgame, nextgame, dateoflastgame, dateofnextgame)

Я пытаюсь выполнить запрос данных, где я могу определить самый длинный пробегКоманда пойдет, не сыграв в одной команде дважды.IE Для команды (CHL, MNU, ARS, 01/01/2020,08/01/2020)

В течение сезона есть несколько записей для КХЛ, имеющих все эти данные, я пытаюсь найти самый длинный пробег, который они имели бы, не наткнувшись на определенную команду, например, MCU.

Например, запуск будет выглядеть как в следующих играх, MCU-BHA-LIV-WHU-TOT-MCU будет запускаться из 4 игр.

Я использовал spark sql и думаю, что буду пытаться играть в следующую игру where teamname='mnu', но яЯ совершенно озадачен тем, как бы я посчитал эти значения и вернул максимальный пробег игр, не играя в MCU.Кроме того, я хотел бы выполнить эту операцию против всех команд в лиге, чтобы получить список самых длинных заездов без игры в MCU.

Есть мысли, с чего я мог бы начать с этого?

1 Ответ

2 голосов
/ 20 сентября 2019

Оконные функции на помощь.

val df = Seq(
    ("CHL", "MCU", "2020-01-01"),
    ("CHL", "BHA", "2020-01-02"),
    ("CHL", "LIV", "2020-01-03"),
    ("CHL", "WHU", "2020-01-04"),
    ("CHL", "TOT", "2020-01-05"),
    ("CHL", "MCU", "2020-01-06")
).toDF("teamname", "nextgame", "dateofnextgame")

val w = Window.partitionBy($"teamname")

df.withColumn("seq", row_number().over(w.orderBy($"dateofnextgame"))).
  withColumn("max", count(lit(1)).over(w)).
  filter($"nextgame" === "MCU").
  withColumn("next_seq", coalesce(lead($"seq" - 1, 1).over(w.orderBy($"seq")), lit($"max"))).
  withColumn("streak", $"next_seq" - $"seq").
  groupBy($"teamname").
  agg(max($"streak").as("max_streak")).
  show

+--------+----------+
|teamname|max_streak|
+--------+----------+
|     CHL|         4|
+--------+----------+

В конце концов, все довольно просто, вы просто присваиваете порядковый номер играм, и самый длинный пробег - это максимальная разница между последовательностью текущей и следующей игры против MCU.

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