聚合模型
建表时,支持定义排序键和指标列,并为指标列指定聚合函数。当多条数据具有相同的排序键时,指标列会进行聚合。在分析统计和汇总数据时,聚合模型能够减少查询时所需要处理的数据,提升查询效率。
适用场景
适用于分析统计和汇总数据。比如:
-
通过分析网站或 APP 的访问流量,统计用户的访问总时长、访问总次数。
-
广告厂商为广告主提供的广告点击总量、展示总量、消费统计等。
-
通过分析电商的全年交易数据,获得指定季度或者月份中,各类消费人群的爆款商品。
在这些场景中, 数据查询和导入,具有以下特点:
-
多为汇总类查询,比如 SUM、MAX、MIN等类型的查询。
-
不需要查询原始的明细数据。
-
旧数据更新不频繁,只会追加新的数据。
原理
从数据导入至数据查询阶段,聚合模型内部同一排序键的数据会多次聚合,聚合的具体时机和机制如下:
-
数据导入阶段:数据按批次导入至聚合模型时,每一个批次的数据形成一个版本。在一个版本中,同一排序键的数据会进行一次聚合。
-
后台文件合并阶段 (Compaction) :数据分批次多次导入至聚合模型中,会生成多个版本的文件,多个版本的文件定期合并成一个大版本文件时,同一排序键的数据会进行一次聚合。
-
查询阶段:所有版本中同一排序键的数据进行聚合,然后返回查询结果。
因此,聚合模型中数据多次聚合,能够减少查询时所需要的处理的数据量,进而提升查询的效率。
例如,导入如下数据至聚合模型中,排序键为 Date、Country:
Date | Country | PV |
---|---|---|
2020.05.01 | CHN | 1 |
2020.05.01 | CHN | 2 |
2020.05.01 | USA | 3 |
2020.05.01 | USA | 4 |
在聚合模型中,以上四条数据会聚合为两条数据。这样在后续查询处理的时候,处理的数据量就会显著降低。
Date | Country | PV |
---|---|---|
2020.05.01 | CHN | 3 |
2020.05.01 | USA | 7 |
创建表
例如需要分析某一段时间内,来自不同城市的用户,访问不同网页的总次数。则可以将网页地址 site_id
、日期 date
和城市代码 city_code
作为排序键,将访问次数 pv
作为指标列,并为指标列 pv
指定聚合函数为 SUM。
在该业务场景下,建表语句如下:
CREATE TABLE IF NOT EXISTS example_db.aggregate_tbl (
site_id LARGEINT NOT NULL COMMENT "id of site",
date DATE NOT NULL COMMENT "time of event",
city_code VARCHAR(20) COMMENT "city_code of user",
pv BIGINT SUM DEFAULT "0" COMMENT "total page views"
)
AGGREGATE KEY(site_id, date, city_code)
DISTRIBUTED BY HASH(site_id)
PROPERTIES (
"replication_num" = "3"
);
注意
使用说明
-
排序键的相关说明:
-
在建表语句中,排序键必须定义在其他列之前。
-
排序键可以通过
AGGREGATE KEY
显式定义。- 如果
AGGREGATE KEY
未包含全部维度列(除指标列之外的列 ),则建表会失败。 - 如果不通过
AGGREGATE KEY
显示定义排序键,则默认除指标列之外的列均为排序键。
- 如果
-
排序键必须满足唯一性约束,必须包含全部维度列,并且列的值不会更新。
-
-
指标列:通过在列名后指定聚合函数,定义该列为指标列。一般为需要汇总统计的数据。
-
聚合函数:指标列使用的聚合函数。聚合模型支持的聚合函数,请参见 CREATE TABLE。
-
查询时,排序键在多版聚合之前就能进行过滤,而指标列的过滤在多版本聚合之后。因此建议将频繁使用的过滤字段作为排序键,在聚合前就能过滤数据,从而提升查询性能。
-
建表时,不支持为指标列创建 BITMAP、Bloom Filter 等索引。
下一步
建表完成后,您可以创建多种导入作业,导入数据至表中。具体导入方式,请参见导入概览。
导入时,仅支持全字段导入,即导入任务需要涵盖表的所有列,例如示例中的
site_id
、date
、city_code
和pv
四个列。