Каков базовый способ агрегирования сроков? - PullRequest
0 голосов
/ 08 ноября 2019

У меня есть функция в JS, она объединяет временную шкалу в подсчитанные интервалы времени просмотра видео на сайте.

Например, 3 посетителя просмотрели видео:

  1. Посетитель # 1 просмотрел все видео, например, временная шкала [[0, 10]] (продолжительность видео 10 секунд)
  2. Посетитель # 2 просмотрел половину видео, например, временная шкала [[0, 5]]
  3. Посетитель# 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) для объединения результатов агрегации.

Где есть несколько проблем:

  1. 1000 обращений к пользователюопределенная функция Python заняла ~ 2 минуты (даже если UDF - это функция из 1 строки, возвращает строку)
  2. Я ограничен длиной строки 64 КБ конечного результата агрегации.
  3. Я не уверенесли это лучший вариант для агрегирования большого объема данных.

Мне интересно, может ли кто-нибудь порекомендовать правильный подход к этому. Возможно, я могу использовать Яндекс ClickHouse вместо AWS Redshift? Или что-то еще?

...