Сбор статистики === ### Схема запроса ```json { "tracks": [ { "start": "2019-03-13T12:00:00Z", "end": "2019-03-13T12:05:00Z", "visitor": { "id": "CCC", "gender": "male", "camera_resolution": "100x100", "identity_type": "person", "quality": 0.82, "age": 32, "age_variation": 5, "ethnicity": "caucasian", "glasses": "dark", "facial_hair": "beard", "hair_color": "gray", "hair_type": "normal", "headwear": "cap", "attributes": { "emotions": [ { "value": "neutral", "time": 10 }, { "value": "neutral", "time": 20 } ], "smile": [ { "value": "no", "time": 10 }, { "value": "yes", "time": 20 } ], "pitch": [ { "value": 10, "time": 10 }, { "value": -40, "time": 20 } ], "yaw": [ { "value": -20, "time": 10 }, { "value": 30, "time": 20 } ], "x": [ { "value": 0.5, "time": 10 }, { "value": 0.8, "time": 20 } ], "y": [ { "value": 0.5, "time": 10 }, { "value": 0.8, "time": 20 } ], "height": [ { "value": 0.6, "time": 10 }, { "value": 0.9, "time": 20 } ] }, "merge": [ "AAA", "BBB" ] }, "views": [ { "campaign_id": 10, "content_id": 10, "content_session_id": "331c6883dd6010864b7ead130be77cd5", "campaign_content_id": 1, "campaign_session_id": "3fbc5f926840bfe1733b70cbca82c0ab", "adblock_id" : 1101, "adblock_session_id" : "3fbc5f926840bfe1733b70cbca82c0ab", "start": "2019-03-13T12:01:00Z", "end": "2019-03-13T12:02:00Z" } ] } ], "shows": [ { "campaign_id": 10, "campaign_content_id": 1, "campaign_session_id": "3fbc5f926840bfe1733b70cbca82c0ab", "content_id": 100, "content_session_id": "917a34072663f9c8beea3b45e8f129c5", "adblock_id" : 1101, "adblock_session_id" : "3fbc5f926840bfe1733b70cbca82c0ab", "start": "2019-03-13T12:00:00Z", "end": "2019-03-13T12:02:00Z" }, { "campaign_id": 10, "campaign_content_id": 3, "campaign_session_id": "3fbc5f926840bfe1733b70cbca82c0ab", "content_id": 100, "content_session_id": "331c6883dd6010864b7ead130be77cd5", "start": "2019-03-13T12:02:00Z", "end": "2019-03-13T12:04:00Z" } ], "campaign_sessions": [ { "id": "3fbc5f926840bfe1733b70cbca82c0ab", "campaign_id": 10, "status": "start", "ts": "2019-03-13T12:02:00Z", "adblock_id" : 1101, "adblock_session_id" : "3fbc5f926840bfe1733b70cbca82c0ab", } ], "adblock_sessions": [ { "id": "3fbc5f926840bfe1733b70cbca82c0ab", "adblock_id": 1101, "status": "start", "ts": "2019-03-13T12:02:00Z" } ], "mac": [ { "start": "2019-10-01T21:10:34.910+03:00", "end": "2019-10-01T21:20:04.637+03:00", "value": "00:00:5e:00:53:01", "vendor" : "awesome vendor" }, { "start": "2019-10-01T21:10:34.910+03:00", "end": "2019-10-01T21:20:04.637+03:00", "value": "02-00-5e-10-00-00-00-01", "vendor": "apple" }, { "start": "2019-10-01T21:10:34.910+03:00", "end": "2019-10-01T21:20:04.637+03:00", "value": "00-00-00-00-fe-80-00-00-00-00-00-00-02-00-5e-10-00-00-00-01" }, { "start": "2019-10-01T21:10:34.910+03:00", "end": "2019-10-01T21:20:04.637+03:00", "value": "0000.5e00.5301" }, { "start": "2019-10-01T21:10:34.910+03:00", "end": "2019-10-01T21:20:04.637+03:00", "value": "0200.5e10.0000.0001" }, { "start": "2019-10-01T21:10:34.910+03:00", "end": "2019-10-01T21:20:04.637+03:00", "value": "0000.0000.fe80.0000.0000.0000.0200.5e10.0000.0001" } ] } ``` ### Описание полей - `track.identity_type` - тип уникальности посетителя: - Тип может содержать одно из двух значений: - person - посчитался дескриптор лица - track - не самый достоверный идентификатор :) - `track.start` - время появленя персоны в зоне видимости камеры - `track.end` - время ухода персоны из зоны видимости камеры - `track.merge` - массив идентификаторов персон, которые являются одной и той же персоной, что и эта. На основе этих данных мы будем "схлопывать" разные персоны в одну - `view.campaign_session_id` - идентификатор сессии показа рекламной кампании, в пределах которой был просмотр данного контента - `view.content_session_id` - идентификатор сессии показа одного контента, в котором был совершен просмотр - `shows.content_session_id` - идентификатор сессии показа одного контента - `track.visitor.attributes` - приходит только если identity_type = person - `track.visitor.attributes.emotions[*].value`- значение эмоции [**anger**, **fear**, **happiness**, **neutral**, **sadness**, **surprise**] - `track.visitor.attributes.smile[*].time`- значение улыбки [**no**, **smiling**] - `track.visitor.attributes.pitch[*].value`- значение pitch (от -180 до 180) - `track.visitor.attributes.yaw[*].value`- значение yaw (от -180 до 180) - `track.visitor.attributes.x[*].value`- значение x (от 0 до 100) - `track.visitor.attributes.y[*].value`- значение y (от 0 до 100) - `track.visitor.attributes.height[*].value`- значение height (от 0 до 100) - `track.visitor.attributes.*[*].time`- время изменения (массив времени последовательный каждый tme > предыдущего) Сохраняем посетителей Сохрянаем просмотры контента по каждому посетителю #### Сессии РК Серверу нужно понимать, когда РК начала и закончила воспроизводиться. Для этого плееру необходимо отправить статус сессии и время. ```json { "id": "3fbc5f926840bfe1733b70cbca82c0ab", "campaign_id" : 10, "status" : "start", "ts" : "2019-03-13T12:02:00Z" } ``` - `сampaign_session.id` - идентификатор сессии - `сampaign_session.status` - статус сессии - Статус может быть 2 типов: - start - Начало воспроизведения РК - end - Конец воспроизведения РК - `сampaign_session.ts` - время события Событие необходимо слать только в случае изменения статуса. ##### Вопросы: - Стоит ли слать только изменения, мб следует постоянно отправлять статус РК во время ее воспроизведения? - Что делать, если устройство по какой-либо причине не пришлет статус о завершения запроса. Какой тайм-аут сессии? ____ ### Как схлопывать треки (не для плеера) #### Встроенными средствами clickhouse - Создать materialized view с агрегационной функцией. Но такой вариант не подойдет, т.к. все треки по одному визитору будут схлопываться в одну сессию, а нам нужно на несколько, чтобы между сессиями было как минимум три часа (настраиваемый параметр). - Создать таблицу с движком AggregatingMergeTree или подобным, но у этого подхода такой же недостаток, как у materialized view - все треки схлопнуться в один. - Схлопывать треки "на лету", т.е. во время select'a, как рассказано в этом видео https://www.youtube.com/watch?v=JJRQ0KhUovc. Но есть сомнения по использованию этого подхода, т.к. не факт, что можно схлопнуть сессии через лямбда-функции (хотя в теории возможность есть) и есть сомнения в производительности данного подхода, т.к. с ростом таблицы данных будет все больше и больше. -