У меня есть функция в JS, она объединяет временную шкалу в подсчитанные интервалы времени просмотра видео на сайте.
Например, 3 посетителя просмотрели видео:
- Посетитель # 1 просмотрел все видео, например, временная шкала
[[0, 10]]
(продолжительность видео 10 секунд) - Посетитель # 2 просмотрел половину видео, например, временная шкала
[[0, 5]]
- Посетитель# 3 просмотрел видео с поиском (он просмотрел фрагмент [2-7] 2 раза), например, временная шкала составляет
[[0, 7], [2, 10]]
В результате у меня есть следующая агрегированная временная шкала с количеством посетителей:
[
[ [ -Infinity, 0 ], 0 ],
[ [ 0, 2 ], 3 ],
[ [ 2, 5 ], 4 ], // e.g. fragment watched 4 times
[ [ 5, 7 ], 3 ],
[ [ 7, 10 ], 2 ],
[ [ 10, Infinity ], 0 ]
]
Реализация JS: https://pastebin.com/KcEtHjLe
Итак, я храню эти данные в базе данных SQL (AWS Redshift) следующим образом:
|--------------|-----------|-----------|-----------|---------------------|
| visitorId | visitId | country | ... | timeline |
|--------------|-----------|-----------|-----------|---------------------|
| 1 | 1 | US | ... | [[0, 10]] |
|--------------|-----------|-----------|-----------|---------------------|
| 2 | 2 | RU | ... | [[0, 5]] |
|--------------|-----------|-----------|-----------|---------------------|
| 3 | 3 | DE | ... | [[0, 7], [2, 10]] |
|--------------|-----------|-----------|-----------|---------------------|
AWSRedshift не поддерживает пользовательскую функцию агрегирования. И я создал хранимую процедуру, которая выбирает все строки и затем вызывает мою функцию UDF (Python) для объединения результатов агрегации.
Где есть несколько проблем:
- 1000 обращений к пользователюопределенная функция Python заняла ~ 2 минуты (даже если UDF - это функция из 1 строки, возвращает строку)
- Я ограничен длиной строки 64 КБ конечного результата агрегации.
- Я не уверенесли это лучший вариант для агрегирования большого объема данных.
Мне интересно, может ли кто-нибудь порекомендовать правильный подход к этому. Возможно, я могу использовать Яндекс ClickHouse вместо AWS Redshift? Или что-то еще?