[关闭]
@Wishes 2021-06-25T03:16:40.000000Z 字数 583 阅读 235


一、背景

由你音乐榜是一个实时的榜单,后台的计算链路用的是flink+druid。榜单会展示歌曲的排名和由你指数,歌曲/歌手的详情页也会展示指数。所以后台的一个基础表的设计大致如下:

trackID uniIndex singerIds moduleIds
歌曲ID 由你指数 歌手ID(数组) 榜单ID(数组)

在Druid的表中大量用到了多值维度(数组),举例一个简单的场景,搜索页查询歌手的指数,那么SQL类似:

  1. select singerIds, sum(uniIndex) from Table where singerIds in (1, 2, 3) group by singerIds

这样的场景在由你的很多业务中都用到了。

二、Druid 多值分组过滤的特性以及缺陷

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行结果。

三、源码改造

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注