• Elasticsearch对于大数据量(上亿量级)的聚合如何实现?


    分析&回答


    Elasticsearch 提供的首个近似聚合是cardinality 度量。它提供一个字段的基数,即该字段的distinct或者unique值的数目。它是基于HLL算法的。HLL 会先对我们的输入作哈希运算,然后根据哈希运算的结果中的 bits 做概率估算从而得到基数。其特点是:可配置的精度,用来控制内存的使用(更精确 = 更多内存);小的数据集精度是非常高的;我们可以通过配置参数,来设置去重需要的固定内存使用量。无论数千还是数十亿的唯一值,内存使用量只与你配置的精确度相关。

    反思&扩展


    HyperLogLog

    下面简称为HLL,它是 LogLog 算法的升级版,作用是能够提供不精确的去重计数。存在以下的特点:

    代码实现较难。

    • 能够使用极少的内存来统计巨量的数据,在 Redis 中实现的 HyperLogLog,只需要12K内存就能统计2^64个数据。
    • 计数存在一定的误差,误差率整体较低。标准误差为 0.81% 。
    • 误差可以被设置辅助计算因子进行降低。

    特点–关键词

    1. 比特串
    2. 分桶
    3. 偏差修正

    方法

    • pfadd key value,将 key 对应的一个 value 存入
    • pfcount key,统计 key 的 value 有多少个

    应用场景

    • 基数不大,数据量不大就用不上,会有点大材小用浪费空间
    • 有局限性,就是只能统计基数数量,而没办法去知道具体的内容是什么
    • 和bitmap相比,属于两种特定统计情况,简单来说,HyperLogLog 去重比 bitmap 方便很多
    • 一般可以bitmap和hyperloglog配合使用,bitmap标识哪些用户活跃,hyperloglog计数

    一般使用:

    • 统计注册 IP 数
    • 统计每日访问 IP 数
    • 统计页面实时 UV 数
    • 统计在线用户数
    • 统计用户每天搜索不同词条的个数

    为了大家更加方便的刷题,我们对文章进行了分类和整理,免费为大家提供刷题服务。程序员不欺骗程序员,赶紧扫码小程序刷起来!
    请添加图片描述

    为了一站式解决面者刷题问题,部分内容可能存在摘录情况,如有侵权辛苦您留言联系我们,我们会删除文章或添加引用文案,Thanks!

  • 相关阅读:
    cmake笔记
    卷积神经网络(VGG-16)海贼王人物识别
    架构篇(七)安全架构
    MB51选择屏幕与报表增强
    TinyOs操作系统---第3章 任务中断间的共享资源保护
    在.Core中用EF添加数据库实体类
    仿游戏热血江湖游戏类31
    基于ssm的大学生实习平台系统(前端+后端)
    Spring AOP案例:百度网盘密码数据兼容处理 与 SpringAOP总结
    MapReduce
  • 原文地址:https://blog.csdn.net/jjclove/article/details/124923315