#python #pyspark #apache-spark-sql
Вопрос:
Мне нужно подсчитать, сколько раз пользователь получал 30 дней без доступа к своей учетной записи за последние два года.
У меня есть фрейм данных, который содержит данные в следующем формате (это образец, но есть исторические данные за последние два года, со всеми входами в систему, выполненными пользователями).:
--------- -------------------
|loginuser| data|
--------- -------------------
| 2024290|2021-02-22 00:00:00|
| 2029635|2021-02-22 00:00:00|
| 2050969|2021-02-22 00:00:00|
| 2078419|2021-02-22 00:00:00|
| 2088587|2021-02-22 00:00:00|
| 2059021|2021-02-22 00:00:00|
| 2119433|2021-02-22 00:00:00|
| 2139092|2021-02-22 00:00:00|
| 2150151|2021-02-22 00:00:00|
| 2176295|2021-02-22 00:00:00|
--------- -------------------
За каждый день за последние 2 года мне нужно проверить, был ли пользователь 30 дней без доступа. Я считаю, что с этой частью я справлюсь просто отлично, но для этого мне понадобится фрейм данных с отметкой времени последнего входа в систему, которую пользователь выполнял до каждого дня года. Как мне это создать ?
Это и есть желаемый результат, то:
loginuser | calendar_day | lastlogin_timestamp
Имея в виду, что отметка lastlogin_timestamp
Я не мог придумать другого способа , кроме как повторять каждый день в календаре и генерировать max(login_timestamp)
, но, учитывая размер моего набора данных, это было бы безумием.
Комментарии:
1. Это не совсем понятно. В этом фрейме данных у вас есть исторические данные?
2. Пожалуйста, предоставьте образец ввода и ожидаемый результат.
3. Пожалуйста, предоставьте достаточно кода, чтобы другие могли лучше понять или воспроизвести проблему.
Ответ №1:
Я думаю, что основная идея заключается в том, что вам нужно сгруппировать как loginuser
по дате, так и по дате, из которой она извлечена data
.
ввод образца
# --------- -------------------
# |loginuser| data|
# --------- -------------------
# | 2024290|2021-02-22 00:00:00|
# | 2024290|2021-02-22 01:00:00|
# | 2024290|2021-02-23 04:00:00|
# | 2024290|2021-02-23 05:00:00|
# | 2078419|2021-02-22 11:00:00|
# | 2078419|2021-02-22 12:00:00|
# | 2078419|2021-02-22 13:00:00|
# --------- -------------------
from pyspark.sql import functions as F
(df
.groupBy('loginuser', F.date_format('data', 'yyyy-MM-dd').alias('calendar_day'))
.agg(F.max('data').alias('lastlogin_timestamp'))
.show()
)
# --------- ------------ -------------------
# |loginuser|calendar_day|lastlogin_timestamp|
# --------- ------------ -------------------
# | 2024290| 2021-02-23|2021-02-23 05:00:00|
# | 2024290| 2021-02-22|2021-02-22 01:00:00|
# | 2078419| 2021-02-22|2021-02-22 13:00:00|
# --------- ------------ -------------------