2014-10-18 3 views
0

У меня есть файлы журналов, содержащие метку времени, идентификатор и действие. У меня есть некоторые примеры данных ниже. Фактические данные - это миллионы строк. Я надеюсь сгруппировать все действия, которые пользователи берут в рамках данного сеанса. И сеанс может быть определен как любой непрерывный вход журналов (от конкретного пользователя), где разрыв между предыдущей меткой времени составляет не более 30 минут.Ломать временные метки в сеансах, разбивая временные метки

timestamp    id action 
2014-06-30 21:57:16 234  1 
2014-06-30 16:47:05 793  3 
2014-06-30 16:47:15 793  1 
2014-06-30 16:47:50 793  2 
2014-06-30 16:48:07 793  5 
2014-06-30 16:48:08 793  6 
2014-06-30 16:48:48 793  7 
2014-06-30 16:49:26 793  1 
2014-06-30 16:49:28 993  3 
2014-06-30 04:24:39 229  2 
2014-06-30 21:53:38 822  4 

Я надеюсь, что кто-то может указать мне в правильном направлении. Я уверен, что это было сделано раньше, но не удалось найти что-либо в Интернете. Думаю, я ищу неправильные вопросы.

Ищете что-то на основе SQL.

+0

Используете ли вы SQL Server (microsoft), MySQL или что-то еще? – Joe

+0

Я нахожусь в Hadoop. Итак, Hive/Pig/Streaming. Но, если нужно, я могу поместить части журналов в Teradata. – cloud36

+0

Yikes. Я надеялся, что вы скажете SQL Server. ;-) В области SQL Server вы, вероятно, могли бы что-то сделать с помощью агрегатной функции, и это было бы не слишком сложно. Полагаю, мне следовало подойти поближе к вашим тегам! – Joe

ответ

0

Я собирался написать это, но очень быстро получил довольно сложный и, к сожалению, я не работаю бесплатно :). Я могу объяснить вам, что вы должны делать вместо этого.

В принципе, вам нужно выбрать список уникальных значений из столбца ID (я предполагаю, что это идентификаторы пользователя). Затем вам необходимо прокрутить список идентификаторов, один за другим, и для каждого из них выбрать список временных меток, соответствующих этому идентификатору, упорядоченным по возрастанию.

Затем вам нужно выбрать самую раннюю метку времени и сравнить ее со следующей меткой времени в восходящем списке, чтобы увидеть, соответствует ли следующая следующая: < или> разница в 30 минут. Если его <, сохраните его, идентификатор и значение действия в новой таблице, с идентификатором, чтобы пометить его как часть сеанса. Затем возьмите вторую метку времени и сравните ее со следующей меткой времени в списке. Если его <, сохраните его и продолжайте просматривать список таким образом. Однако, если следующее значение составляет> 30 минут, сгенерируйте новый уникальный идентификатор сеанса, а затем продолжите движение по списку.

В целом, это не что-то такое, что вы рекомендуете делать в sql, особенно если вы планируете делать это на каком-то сервере, который где-то работает и активно пишет эту таблицу, так как вы собираетесь создавать массивные блокировки, если это действительно так , Это то, что было бы лучше сделано в прикладном уровне где-нибудь, если это возможно. Если это невозможно, id рекомендует вам скопировать данные в некоторые временные таблицы, прежде чем приступать к ее анализу.

Если вы планируете делать это более одного раза, идентификатор также, вероятно, рекомендует вам посмотреть, можно ли добавить идентификатор сеанса к данным везде, где он сгенерирован.

Смежные вопросы