@Wishes
2021-06-25T03:16:40.000000Z
字数 583
阅读 281
由你音乐榜是一个实时的榜单,后台的计算链路用的是flink+druid。榜单会展示歌曲的排名和由你指数,歌曲/歌手的详情页也会展示指数。所以后台的一个基础表的设计大致如下:
trackID | uniIndex | singerIds | moduleIds |
---|---|---|---|
歌曲ID | 由你指数 | 歌手ID(数组) | 榜单ID(数组) |
在Druid的表中大量用到了多值维度(数组),举例一个简单的场景,搜索页查询歌手的指数,那么SQL类似:
select singerIds, sum(uniIndex) from Table where singerIds in (1, 2, 3) group by singerIds
这样的场景在由你的很多业务中都用到了。
druid在对多值分组的时候,会把多值列打平(flat),得到多行结果。以上述的SQL为例,SQL执行的时候,会先执行where过滤条件,然后再执行多值列打平得到分组的结果,也就是说where的条件不会过滤分组之后的结果。例如有如下表:
trackID | uniIndex | singerIds | moduleIds |
---|---|---|---|
123 | 10 | [1, 2, 4] | [98, 99] |
124 | 20 | [1, 5] | [98, 99] |
上述SQL执行得到的结果是:
singerIds | sum(uniIndex) |
---|---|
1 | 30 |
2 | 10 |
4 | 10 |
5 | 10 |
这样的结果不符合我们的预期,我们只需要第1,2行结果。