Doris 的聚合模型主要用于 Aggregate Key 表,在这种表中,Doris 会根据用户指定的聚合函数对具有相同主键的数据进行聚合。聚合模型定义了数据的聚合方式,是聚合表存储和计算的核心。
常见的聚合模型
以下是 Doris 支持的主要聚合模型(聚合函数):
1. SUM (求和)
- 功能:对相同主键的列数据进行求和。
- 场景:适用于需要累积值的场景,例如订单总额统计、商品销量统计等。
- 示例:
- 数据写入:
主键 | 数量 1001 | 10 1001 | 20
- 聚合后:
主键 | 数量 1001 | 30
- 数据写入:
2. MIN (最小值)
- 功能:对相同主键的列数据取最小值。
- 场景:适用于需要获取某个字段的最小值的场景,例如记录商品最低价格、最早交易时间等。
- 示例:
- 数据写入:
主键 | 价格 1001 | 50 1001 | 30
- 聚合后:
主键 | 价格 1001 | 30
- 数据写入:
3. MAX (最大值)
- 功能:对相同主键的列数据取最大值。
- 场景:适用于需要获取某个字段最大值的场景,例如记录商品最高价格、最近交易时间等。
- 示例:
- 数据写入:
主键 | 价格 1001 | 50 1001 | 70
- 聚合后:
主键 | 价格 1001 | 70
- 数据写入:
4. REPLACE (替换)
- 功能:将相同主键的最新数据替换旧数据。
- 场景:适用于需要保持最新状态的场景,例如记录用户最近一次登录时间、最新状态等。
- 示例:
- 数据写入:
主键 | 状态 1001 | 正常 1001 | 异常
- 聚合后:
主键 | 状态 1001 | 异常
- 数据写入:
5. REPLACE_IF_NOT_NULL (非空替换)
- 功能:与 REPLACE 类似,但仅当新数据非空时才替换旧数据。
- 场景:适用于部分数据允许空值但需要优先保留非空值的场景。
- 示例:
- 数据写入:
主键 | 状态 1001 | 正常 1001 | NULL
- 聚合后:
主键 | 状态 1001 | 正常
- 数据写入:
6. HLL (HyperLogLog)
- 功能:一种基于概率的去重计数方法,用于近似计算唯一值的数量。
- 场景:适用于大规模数据的去重计数,例如计算网站的日活跃用户数(UV)。
- 示例:
- 数据写入:
主键 | 用户ID 1001 | 用户A 1001 | 用户B 1001 | 用户A
- 聚合后:
主键 | 唯一用户数 1001 | 2
- 数据写入:
7. BITMAP_UNION (位图聚合)
- 功能:基于位图数据结构的聚合,适合快速计算去重计数。
- 场景:类似 HLL,用于高效的去重统计,但精度更高(消耗内存更多)。
- 示例:
- 数据写入:
主键 | 用户ID 1001 | 用户A 1001 | 用户B 1001 | 用户A
- 聚合后:
主键 | 唯一用户数 1001 | 2
- 数据写入:
8. PERCENTILE_UNION (百分位数计算)
- 功能:对数据进行百分位数统计,用于计算如 P50、P90、P99 等分位点。
- 场景:适用于需要分位点分析的场景,例如响应时间的 P99 分位值、延迟分析等。
- 示例:
- 数据写入:
主键 | 延迟(ms) 1001 | 100 1001 | 200 1001 | 300
- 聚合后(计算 P50):
主键 | P50 延迟 1001 | 200
- 数据写入:
聚合模型选择
- SUM、MIN、MAX:适用于基本统计计算(如总和、最值)。
- REPLACE、REPLACE_IF_NOT_NULL:适用于状态更新或需要保持最新值的场景。
- HLL、BITMAP_UNION:适用于高效去重计数,HLL 精度较低但占用空间小,BITMAP_UNION 精度高但占用内存多。
- PERCENTILE_UNION:适用于复杂分析如分位点计算。
通过合理选择聚合模型,Doris 能够高效处理各种分析任务,从而满足不同业务场景需求。