Как я могу определить сеансы из столбца datetime в pyspark - PullRequest
0 голосов
/ 16 ноября 2018

У меня есть журнал сервера, который в основном состоит из 3 столбцов:

  • отметка времени
  • ID
  • Действие

+-------------------+-------------+-------------+
|     time          |    ID       |    Action   |
+-------------------+-------------+-------------+
|2018-09-14 12:52:33|   Henry     |   Action F  |
|2018-09-15 17:34:00|   Henry     |   Action R  |
|2018-09-15 20:12:33|   Henry     |   Action T  |
|2018-09-15 14:34:33|   Jess      |   Action G  |
|2018-09-17 12:21:33|   Jess      |   Action R  |
|2018-09-19 23:11:33|   Jess      |   Action R  |
|2018-09-21 09:22:01|   Sarah     |   Action U  |
|2018-09-14 12:52:33|   Ali       |   Action P  |
|2018-09-14 12:53:33|   Ali       |   Action U  |
|2018-09-14 12:54:29|   Ali       |   Action U  |
|2018-09-14 12:54:51|   Ali       |   Action X  |
|2018-09-14 14:09:12|   Ali       |   Action O  |
|2018-09-14 14:13:32|   Ali       |   Action T  |
|2018-09-18 22:52:21|   Ali       |   Action E  |
|2018-09-20 12:52:44|   John      |   Action W  |
|2018-09-20 12:54:13|   John      |   Action Z  |
|2018-09-17 09:26:13|   Mike      |   Action W  |
|2018-09-17 10:39:33|   Mike      |   Action Q  |
|2018-09-18 12:15:33|   Mike      |   Action L  |
|2018-09-18 12:15:36|   Mike      |   Action L  |
+-------------------+---------------------------+
only showing top 20 rows

Теперь я хотел бы (для каждого идентификатора) разбить временную метку на сеансы, где сеанс представляет собой непрерывную активность с промежутком между действиями менее 3 часов.(пауза в 3 часа или более начинает новый сеанс)

Затем я хочу сгруппировать по [Id, Session], чтобы получить:

  • начало сеанса
  • конец сеанса
  • список действий в этом сеансе

Как это:

+-------------+------------------------------------+-----------------------+-----------------------+
|    ID       |              Action_list           |           start       |          end          |
+-------------+------------------------------------+-----------------------+-----------------------+
|   Henry     |               [Action F]           |  2018-09-14 12:52:33  |  2018-09-14 12:52:33  |
|   Henry     |           [Action R, Action T]     |  2018-09-15 17:34:00  |  2018-09-15 20:12:33  |
|   Jess      |               [Action G]           |  2018-09-15 14:34:33  |  2018-09-15 14:34:33  |
|   Jess      |               [Action R]           |  2018-09-17 12:21:33  |  2018-09-17 12:21:33  |
|   Jess      |               [Action R]           |  2018-09-19 23:11:33  |  2018-09-19 23:11:33  |
|   Sarah     |               [Action U]           |  2018-09-21 09:22:01  |  2018-09-21 09:22:01  |
|   Ali       |  [Action P, Action U, Action U...] |  2018-09-14 12:52:33  |  2018-09-14 14:13:32  |
|   Ali       |               [Action E]           |  2018-09-18 22:52:21  |  2018-09-18 22:52:21  |
|   John      |               [Action Z]           |  2018-09-20 12:52:44  |  2018-09-20 12:54:13  |
|   Mike      |            [Action W, Action Q]    |  2018-09-17 09:26:13  |  2018-09-17 10:39:33  |
|   Mike      |            [Action L, Action L]    |  2018-09-18 12:15:33  |  2018-09-18 12:15:36  |
+-------------+------------------------------------+-----------------------+-----------------------+

Вот код для воспроизведения фрейма данных.

l=[('2018-09-14 12:52:33',   'Henry'     ,   'Action F'),
   ('2018-09-15 17:34:00',   'Henry'     ,   'Action R'),
   ('2018-09-15 20:12:33',   'Henry'     ,   'Action T'), 
   ('2018-09-15 14:34:33',   'Jess'      ,   'Action G'),
   ('2018-09-17 12:21:33',   'Jess'      ,   'Action R'),
   ('2018-09-19 23:11:33',   'Jess'      ,   'Action R'),
   ('2018-09-21 09:22:01',   'Sarah'     ,   'Action U'),
   ('2018-09-14 12:52:33',   'Ali'       ,   'Action P'),
   ('2018-09-14 12:53:33',   'Ali'       ,   'Action U'),
   ('2018-09-14 12:54:29',   'Ali'       ,   'Action U'),
   ('2018-09-14 12:54:51',   'Ali'       ,   'Action X'),
   ('2018-09-14 14:09:12',   'Ali'       ,   'Action O'),
   ('2018-09-14 14:13:32',   'Ali'       ,   'Action T'),
   ('2018-09-18 22:52:21',   'Ali'       ,   'Action E'),
   ('2018-09-20 12:52:44',   'John'      ,   'Action W'),
   ('2018-09-20 12:54:13',   'John'      ,   'Action Z'),
   ('2018-09-17 09:26:13',   'Mike'      ,   'Action W'),
   ('2018-09-17 10:39:33',   'Mike'      ,   'Action Q'),
   ('2018-09-18 12:15:33',   'Mike'      ,   'Action L'),
   ('2018-09-18 12:15:36',   'Mike'      ,   'Action L')]
  df = sqlContext.createDataFrame(l, ['time','name', 'action'])

Буду очень признателен за любую помощь

PS Идентификаторыхэшируются.Имена приведены здесь для простоты, поэтому здесь нет нарушений конфиденциальности;)

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