Рассчитайте последнее появление до каждого дня в pyspark

#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|
#  --------- ------------ -------------------