184 похожих чатов

Ребят, всем привет, есть вопрос. Не знаю, как решить средствами

КХ.

Есть таблица для ивентов вида:


(
ID UInt32
Event String
GUID String
Path String
IP UInt32
UserID UInt32
TrackedDate Date
)


GUID — идентификатор юзера в браузере (кука), Event — что произошло (page или image), Path — урл события, UserID — некий параметр для группы.

У меня есть задача — получить все ивенты с Path = %success% с Event = page` для которых есть другой Event = image. собственно это решается достаточно легко:


SELECT *
FROM analytics.EventTrack
WHERE (UserID = 92) AND (Event = 'page') and (Path like '%onepage/success%') AND (TrackedDate >= toDate('2017-09-01')) AND GUID IN (
SELECT GUID
FROM analytics.EventTrack
WHERE (UserID = 92) AND (Event = 'image') AND (TrackedDate >= toDate('2017-09-01'))
)


Есть ситуация, когда пользователь сменил браузер, то есть у него может быть два GUID, но одинаковый IP. В реляционной БД я бы сделал алиас для таблицы и в сабквери бы сверял IP и дату (допустим, не больше суток, потому что динамический айпи, все дела).

Как сделать в КХ, понятия не имею. Были мысли пробовать собирать IP адреса с датами в Memory таблицу (не работал ранее). Но правильно ли это?

2 ответов

3 просмотра

У нас сейчас похожая история со списком пользователей имеется. Есть определенная бизнес-логика по которой собирается конечный список пользователей по которым агрегировать данные. Мы собираем список, в TSV файлик и вместе с select запросом на сервер в виде временной таблицы. Работает замечательно.

я бы делал внешний словарь, который содержит текущую проклейку пользователей в виде guid-> id связной компоненты склейки, и отдельным процессом лопатил эти же логи на предмет одинаковых ip или еще какая логика вам в голову придет. словарь потом можно использовать двумя способами, 1. при вставке данных забирать в события текущее состояние склейки 2. при чтении забирать последнее наиболее актуальное состояние. дальше, в вашем запросе "все события1 для которых есть событие2" происходит что-то вроде джойна на себя же по (userid, guid) при этом достаточно произвольное условие на дату, т.е. события могут быть в любом порядке. и любом количестве. может так и должно быть. в любом случае, количество guid со временем неограниченно растет, возможны спецэффекты. дальше, если вы будете шардировать хранение, вам желательно организовать данные так, чтобы объединение результатов на шардах происходило как можно позже, например чтобы джойн был локальным на шарде. это значит что данные должны шардироваться так, чтобы история одного человека попадала в одну машину. это вряд ли получится, если например у вас для guid динамическое объединение в одного человека. это не значит что так не надо делать, просто надо понимать последствия. хотя если у вас id события int32, то возможно вам это не нужно. и ip только v4. в целом задача про последовательности событий в реляцинном случае обычно включает в себя джойн большой таблицы на саму себя по ключу с большой кардинальностью, и нормально не работает. но возможно у вас все не так плохо.

Похожие вопросы

Обсуждают сегодня

зачем же переименовывать ? чтобы кол-во участников возросло или вдруг IBM от этого снова на свифте начнет кодить ? Я не понимаю что страшного в том что свифт гавно, если это т...
Oleh Nerzh
10
здравствуйте. совершаю вот такую вещь: strcpy(line, (char)current_number); где current number — неподписанный шорт, line — массив чаров. ругань следующая: main.c:29:30: error...
Roberto's Ширгозиев
13
я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
100
@MrMiscipitlick А можешь макрос написать, который будет вычислять смещение относительно переданных меток? Просто .label1-.label2, и вернуть значение.
КТ315
35
Можно попросить небольшое ревью кода? Тут немнога, я ничего интереснее не придумал, чем написать аналог tree в качестве практики с cmake. https://github.com/hrimov/tree-unix/...
Andrew Hrimov
11
Всем привет. Ребят подскажите пожалуйста. Вопрос по дизасемблировани. Начну с начала. У меня есть скомпилированная программа на ГО (я разработчик) - в ней есть защита лицензии...
Zloy
11
А еще в перле можно уже @arr1 + @arr2?
Sergei Zhmylove
53
Привет всем. появился вопрос. Разрабатываю сайт, в данный момент он запущен. Хостинг beget. Добавляю на сайт яндекс метрику с помощью полей client-settings (взято отсюда http...
Andrew
2
Но если Евгений и Алекс используют в боевых условиях, то почему нет? А ты как-то про бизнес больше задвигаешь, это имеет к разработке отношение, но все же этим больше другие л...
Keiman
4
все привет. подскажите может кто сталкивался evo 3 если в formlister в параметр formTpl указать имя чанка а не через @CODE то в указанном чанке не парсятся плейсхолдеры [**]? ...
Иван Тарасевич
7
Карта сайта