对于聚合查询,其处理是分两阶段完成的:
- Shard本地的Lucene Index并行计算出局部的聚合结果;
- 收到所有的Shard的局部聚合结果,聚合出最终的聚合结果 。
除此之外Elasticsearch还有另外一个减少聚合过程中网络传输量的优化,那就是Hyperloglog算法 。在计算unique visitor(uv)这样的场景下,经常需要按用户id去重之后统计人数 。最简单的实现是用一个hashset保存这些用户id 。但是用set保存所有的用户id做去重需要消耗大量的内存,同时分布式聚合的时候也要消耗大量的网络带宽 。Hyperloglog算法以一定的误差做为代价,可以用很小的数据量保存这个set,从而减少网络传输消耗 。
为什么时间序列需要更复杂的聚合?
关系型数据库支持一些很复杂的聚合查询逻辑,比如:
- Join两张表;
- Group by之后用Having再对聚合结果进行过滤;
- 用子查询对聚合结果进行二次聚合 。
12:05:05 湖南 8112:05:07 江西 3012:05:11 湖南 8012:05:12 江西 3212:05:16 湖南 8012:05:16 江西 30按1分钟频率进行max的降频操作得出的结果是:
12:05 湖南 8112:05 江西 32这种按max进行降频的最常见的场景是采样点的归一化 。不同的采集器采样的时间点是不同的,为了避免漏点也会加大采样率 。这样就可能导致一分钟内采样多次,而且采样点的时间都不对齐 。在查询的时候按max进行降频可以得出一个统一时间点的数据 。
按sum进行降维的结果是:
12:05 113经常我们需要舍弃掉某些维度进行一个加和的统计 。这个统计需要在时间点对齐之后再进行计算 。这就导致一个查询需要做两次,上面的例子里:
- 先按1分钟,用max做降频;
- 再去掉省份维度,用sum做降维 。
这个功能看似简单,其实非常难以实现 。很多所谓的支持大数据的数据库都只支持简单的一次聚合操作 。Elasticsearch 将要发布的 2.0 版本的最重量级的新特性是Pipeline Aggregation,它支持数据在聚合之后再做聚合 。类似SQL的子查询和Having等功能都将被支持 。
推荐阅读
- 你听过最温暖的话是什么 你听过最暖心的一句话
- 梦见养了只狗特别听话 梦到自己养了一条很听话的狗
- 总是听到有人说AndroidX,到底什么是AndroidX?
- 这5张高清5G关键材料全景图,听说90%的材料人都在偷偷收藏
- 茶韵
- 歌曲|新“洗脑”神曲!《孤勇者》被小学生唱火了 陈奕迅:听说我出了首儿歌?
- 动物|猫奴意外发现:猫头上被放滚轮贴就会乖乖听话 瞬间定格
- 火星|毅力号证实火星声音速度更慢:先听高音后听低音 4米就失真
- 全国火车站名称 全国火车站名字典
- 信阳茶产地 品茶听故事
