开发者社区 问答 正文

关于flink-sql count/sum 数据如何每天重新计算

现有此场景: 计算每天员工的业绩(只计算当天的)

现在我用flink-sql 的方式,insert into select current_date, count(1) ,worker from XX where writeTime>=current_date group by worker; 把数据按天分区的方式先把数据sink到mysql

但是发现落地到mysql的数据把前几天的数据都给算进来了,如何只算今天的数据? 另外还有一个疑惑,如何既计算当天数据,又包含了本月的所有数据?*来自志愿者整理的flink

展开
收起
毛毛虫雨 2021-12-06 15:39:29 1149 分享 版权
阿里云 AI 助理回答

问题描述

用户希望使用Flink SQL按天统计员工业绩,仅计算每天的数据并sink到MySQL。但实际操作中发现数据包含了前几天的记录,而非仅限于当天。此外,用户还想知道如何在同一个查询中既计算当天数据,又能汇总本月的所有数据。

解决方案

针对只计算今天数据的问题:

  1. 确保writeTime字段正确过滤当天数据:

    • 确保writeTime字段是时间戳类型,并且在where子句中正确地使用日期函数来限定只选取今天的记录。例如,如果writeTime包含日期和时间信息,应使用类似DATE(writeTime) = CURRENT_DATE的条件来精确筛选当天数据。
    INSERT INTO daily_performance 
    SELECT CURRENT_DATE, COUNT(1), worker 
    FROM XX 
    WHERE DATE(writeTime) = CURRENT_DATE -- 确保只选择今天的记录
    GROUP BY worker;
    
  2. 检查事件时间处理配置:

    • 如果你的数据流基于事件时间(event time),请确认是否正确设置了水印(watermark),以确保窗口聚合仅基于已到达的数据进行计算。

针对同时计算当天及本月总数据的问题:

  • 可以通过构造两个查询来实现这一需求:一个查询专注于当天数据,另一个查询汇总本月数据,然后将这两个结果合并或分别sink到不同的表中。
-- 计算当天数据
INSERT INTO today_performance 
SELECT CURRENT_DATE, COUNT(1), worker 
FROM XX 
WHERE DATE(writeTime) = CURRENT_DATE
GROUP BY worker;

-- 计算本月所有数据(假设writeTime字段可以准确区分月份)
INSERT INTO this_month_performance 
SELECT DATE_FORMAT(CURRENT_DATE, 'yyyy-MM') AS month, COUNT(1), worker 
FROM XX 
WHERE DATE_FORMAT(writeTime, 'yyyy-MM') = DATE_FORMAT(CURRENT_DATE, 'yyyy-MM') -- 确保只选择本月的记录
GROUP BY worker;

注意事项

  • 时区问题:确保服务器和数据库的时区设置与预期相符,避免因时区差异导致数据筛选不准确。
  • 性能考量:对于大流量数据,频繁的全月数据汇总可能影响性能,考虑使用窗口函数(window function)或定期调度任务来优化。
  • 数据分区策略:在MySQL中合理设计表的分区策略,如按日期分区,可提高查询效率。

总结

要解决只计算当天数据的问题,需确保where子句正确使用日期函数限制时间范围。若需同时处理当天和当月数据,可以通过构造独立的查询分别sink到不同表或视图中。注意时区、性能和数据分区策略的优化。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答