Modelo agregado
Es un modelo de tabla que agrega automáticamente datos con la misma clave . Las columnas de la tabla se dividen en Clave (columna de dimensión) y Valor (columna de indicador) según si se establece AggregationType. Las que no tienen AggregationType se denominan Clave y las que tienen AggregationType establecido se denominan Valor. Cuando importamos datos, las filas con la misma columna Clave se agregarán en una fila y la columna Valor se agregará de acuerdo con el AggregationType establecido. AggregationType actualmente tiene los siguientes cuatro métodos de agregación:
-
SUMA: Suma, se acumulan los valores de varias filas.
-
REEMPLAZAR: Reemplazo, el Valor en el siguiente lote de datos reemplazará el Valor en la fila importada anteriormente.
-
REPLACE_IF_NOT_NULL: no actualizar cuando se encuentre un valor nulo.
-
MAX: Mantiene el valor máximo.
-
MIN: Mantiene el valor mínimo.
Se presenta el siguiente escenario: se necesita crear una tabla para registrar toda la información del comportamiento de consumo de cada usuario de la empresa, con los siguientes campos:
identificación de usuario | Fecha de inserción de datos | Ciudad | edad | género | tiempo de entrevista | Cantidad de cada consumo | Duración de la estancia del usuario |
10000 | 2017/10/1 | Beijing | 20 | 0 | 2017/10/01 06:00:00 | 20 | 10 |
10000 | 2017/10/1 | Beijing | 20 | 0 | 2017/10/01 07:00:00 | 15 | 2 |
10000 | 2017/10/1 | Beijing | 20 | 0 | 2017/10/01 08:00:00 | 30 | 15 |
10001 | 2017/10/1 | Beijing | 30 | 1 | 2017/10/01 17:05:45 | 2 | 22 |
Además, la empresa está especialmente preocupada por estos datos y un informe
La última vez que cada usuario visitó nuestra página, el monto total gastado por el usuario y el tiempo máximo y mínimo que permaneció en nuestra página.
identificación de usuario | Fecha de inserción de datos | Ciudad | edad | género | hora de la última visita | El consumo total de este usuario. | La duración máxima de la estancia de este usuario. | La estancia mínima del usuario |
10000 | 2017/10/1 | Beijing | 20 | 0 | 2017/10/01 08:00:00 | sesenta y cinco | 15 | 2 |
10001 | 2017/10/1 | Beijing | 30 | 1 | 2017/10/01 17:05:45 | 2 | 22 | 22 |
Cada vez que desee ver este informe, deberá ejecutar un SQL estadístico en la "tabla de detalles".
Select
user_id,data,city,age,gender,
max(visit_data) as last_visit_data,
sum(cost) as cost,
max(dwell_time) as max_dwell_time,
min(dwell_time) as min_dwell_time
From t
Group by user_id,data,city,age,gender -- 对应的是聚合模型型key
Modelo de agregación
identificación de usuario | Fecha de inserción de datos | Ciudad | edad | género | hora de la última visita | El consumo total de este usuario. | La duración máxima de la estancia de este usuario. | La estancia mínima del usuario |
10000 | 2017/10/1 | Beijing | 20 | 0 | 2017/10/01 08:00:00 | sesenta y cinco | 15 | 2 |
10001 | 2017/10/1 | Beijing | 30 | 1 | 2017/10/01 17:05:45 | 2 | 22 | 22 |
ejemplo de sql:
-- 这是一个用户消费和行为记录的数据表
CREATE TABLE IF NOT EXISTS test.ex_user
(
`user_id` LARGEINT NOT NULL COMMENT "用户 id",
`date` DATE NOT NULL COMMENT "数据灌入日期时间",
`city` VARCHAR(20) COMMENT "用户所在城市",
`age` SMALLINT COMMENT "用户年龄",
`sex` TINYINT COMMENT "用户性别",
`last_visit_date` DATETIME REPLACE DEFAULT "1970-01-01 00:00:00" COMMENT "用户最后一次访问时间",
`cost` BIGINT SUM DEFAULT "0" COMMENT "用户总消费",
`max_dwell_time` INT MAX DEFAULT "0" COMMENT "用户最大停留时间",
`min_dwell_time` INT MIN DEFAULT "99999" COMMENT "用户最小停留时间"
)
ENGINE=olap
AGGREGATE KEY(`user_id`, `date`, `city`, `age`, `sex`)
-- 分区
-- 分桶
DISTRIBUTED BY HASH(`user_id`) BUCKETS 1;
Insertar algunos datos en la tabla.
insert into test.ex_user values\
(10000,'2017-10-01','北京',20,0,'2017-10-01 06:00:00',20,10,10),\
(10000,'2017-10-01','北京',20,0,'2017-10-01 07:00:00',15,2,2),\
(10001,'2017-10-01','北京',30,1,'2017-10-01 17:05:45',2,22,22),\
(10002,'2017-10-02','上海',20,1,'2017-10-02 12:59:12',200,5,5),\
(10003,'2017-10-02','广州',32,0,'2017-10-02 11:20:00',30,11,11),\
(10004,'2017-10-01','深圳',35,0,'2017-10-01 10:00:15',100,3,3),\
(10004,'2017-10-03','深圳',35,0,'2017-10-03 10:20:22',11,6,6);
Al verificar los datos, descubrí que solo quedaban 6 datos, esto se debe a que cuando las claves son las mismas, los resultados posteriores se agregan.
Implementación de casos
ejemplo
-- 数据
订单id,userId,商品id,购买件数,支付的金额,订单日期
1,u01,p01,2,20,2022-12-01
1,u01,p02,1,10,2022-12-01
1,u01,p01,1,10,2022-12-01
2,u02,p03,2,40,2022-12-01
需求:
创建一个doris的聚合模型的表,插入上述明细数据后,自动聚合出如下结果:
订单日期,订单id,userId,商品id,购买得总件数,支付总额
key是什么?
value是什么?
要求:
按天分区(每天一个分区)
每个分区要划分成2个桶
表的数据需要保存2个副本
表的数据初始存储介质指定为SSD
设置冷却时间为2023年6月5日18点
-- 建表语句
create table order_1
(
`date` date COMMENT "日期时间",
`oid` bigint COMMENT "订单id",
`userid` varchar(255) COMMENT "用户id",
`spid` varchar(255) COMMENT "商品id",
`total` int sum COMMENT "商品总数",
`pay` int sum COMMENT "支付总金额"
)
ENGINE=olap
AGGREGATE KEY(`date`,`oid`,`userid`,`spid`)
partition by range(`date`)
(
partition `p20221201` values less than ("2022-12-02"),
partition `p20221202` values less than ("2022-12-03"),
partition `p20221203` values less than ("2022-12-04")
)
DISTRIBUTED BY HASH(`userid`) BUCKETS 2
properties(
"replication_num"="2",
"storage_medium" = "SSD"
);
-- 插入数据
insert into order_1 values
('2022-12-01',1,'u01','p01',2,20),
('2022-12-01',1,'u01','p02',1,10),
('2022-12-01',1,'u01','p01',1,10),
('2022-12-01',2,'u02','p03',2,40);