我在JS中有一个功能,它可以将时间轴聚合为按一定的时间间隔观看网站上的视频。
例如,有3位访客观看了一个视频:
- 第一位观众观看了整个视频,例如时间轴为
[[0,10]]
(视频时长为10秒) - 第2位观众观看了一半的视频,例如时间轴是
[[0,5]]
- 第3位观众观看影片时(例如观看片段[2-7] 2次),例如时间轴是
[[0,7],[2,10]]
结果,我得到了以下汇总的时间表以及访问者人数:
[
[ [ -Infinity,0 ],[ [ 0,2 ],3 ],[ [ 2,5 ],4 ],// e.g. fragment watched 4 times
[ [ 5,7 ],[ [ 7,10 ],[ [ 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,10]] |
|--------------|-----------|-----------|-----------|---------------------|
AWS Redshift不支持用户定义的聚合功能。然后,我创建了一个存储过程,该过程将获取所有行,然后调用我的UDF(Python)函数来合并聚合结果。
有几个问题:
- 对用户定义的Python函数的1000次调用耗时约2分钟(即使UDF是1行函数,也会返回一个字符串)
- 我将最终聚合结果的字符串长度限制为64K。
- 我不确定这是否是汇总大量数据的最佳选择。
我想知道是否有人可以推荐正确的方法。也许我可以使用Yandex ClickHouse代替AWS Redshift?还是其他?