使用场景:实时数据,同一数据流中,即要小时分段销售金额,也需要累计值金额
技术方案使用flink加工流式数据,如果采用按累计开窗,会对状态使用内存占比高,控制整点小时触发,但是不建议使用,可以使用按小时分段计算的方式,累计值 使用开窗函数进行聚合,sink表为mysql8,可以跳转,如果是mysq5.7,就菜B了,不过还有一种方式,那就是sink换成 doris,也能有效的支持这种场景,下面是示例,doris 做实时查询的并发后续待验证
drop table IF EXISTS doris_db.t2;
CREATE TABLE IF NOT EXISTS doris_db.t2
(
`dt` INT(10) NOT NULL COMMENT "日期",
`h` INT(10) NOT NULL COMMENT "时间段",
`amt` DECIMAL(9,2) COMMENT "金额"
)
UNIQUE KEY(`dt`,`h`)
DISTRIBUTED BY HASH(`dt`,`h`) BUCKETS 1
PROPERTIES (
"replication_allocation" = "tag.location.default: 1",
"enable_unique_key_merge_on_write" = "true"
);
insert into doris_db.t2 values('20240101',1,1.1);
insert into doris_db.t2 values('20240101',2,2.1);
insert into doris_db.t2 values('20240101',3,3.1);
insert into doris_db.t2 values('20240101',4,4.1);
insert into doris_db.t2 values('20240101',5,5.1);
insert into doris_db.t2 values('20240101',5,6.1);
明细
'2024010101',1.1
'2024010102',1.1
'2024010103',1.1
效果
'2024010101',1.1
'2024010102',2.2
'2024010103',3.3
select dtime,
sum(amt) over
(
partition by dtime
) as 'amt'
from doris_db.t2
;
select
dt,h, sum(amt) over(
partition by dt order by h
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
) as sum_amt
from doris_db.t2
order by dt,h
;
结果效果
+----------+------+---------+
| dt | h | sum_amt |
+----------+------+---------+
| 20240101 | 1 | 1.10 |
| 20240101 | 2 | 3.20 |
| 20240101 | 3 | 6.30 |
| 20240101 | 4 | 10.40 |
| 20240101 | 5 | 16.50 |
+----------+------+---------+