Классика баз данных - статьи



         

Формирование данных о пользовательских сессиях на основе журнальных файлов Web-сайтов - часть 2


Затем каждый раздел упорядочивается по временным меткам. Имеются два раздела специальных аргументов: TIMECOLUMN и TIMEOUT. Во время инициализации раздел аргумента TIMECOLUMN указывает, какой атрибут входной таблицы будет анализироваться для определения принадлежности к сессии. Также сохраняется и значение аргумента TIMEOUT, так что оно может использоваться во время выполнения для определения того, не обнаружена ли граница какой-либо сессии. Во время инициализации SQL/MR функция sessionize также определяет свою результирующую схему, как схему входной таблицы, к которой добавлен атрибут session целого типа. Такое поведение позволяет использовать SQL/MR-функцию sessionize при любой схеме входной таблицы. Для достижения еще большей гибкости можно было бы добавить третий собственный раздел аргумента OUTPUTALIAS. Тогда во время выполнения пользователь мог бы указать имя нового столбца таблицы сессий.

Реализация SQL/MR-функции sessionize очень проста. Она реализуется как функция над разделами, при вызове которой входная таблица разделяется по значениям атрибута, определяющего, чьи сессии мы хотим выявлять, например, userid. Внутри каждого раздела входные данные должны быть упорядочены по значениям атрибута, определяющего границы сессий, например, ts. Для каждого обработанного раздела счетчик сессий инициализируется нулем. За один проход по каждому разделу SQL/MR-функция sessionize сравнивает значения TIMECOLUMN соседних кортежей для определения того, не превышает ли разность этих значений заданное значение TIMEOUT. Если не превышает, то для обоих кортежей в номер сессии заносится текущее значение счетчика сессий, иначе счетчик сессий увеличивается на единицу, и номеру сессии кортежа с большим значением TIMECOLUMN присваивается новое значение счетчика. Исходный код этой функции показан в подразделе 3.3, в котором описывается интерфейс программирования SQL/MR.




Содержание  Назад  Вперед