如何实现 T+0 的查询统计?

 

T+0 查询是指实时数据查询,数据统计时可以查询到最新产生的数据。对应的还有非实时的 T+1、T+N 查询。直接使用业务库查询就可以实现 T+0,但数据量大了之后就会影响业务交易了。一般会拆分出单独的分析库用于查询,这时要实现 T+0 就会涉及跨库查询(冷数据在分析库,热数据在业务库)。无论使用数据库自身的同步机制(如 OGG),还是借助数据库的跨库查询(如 DBLink)实现都不理想,限制很多而且性能很差,对异构数据库支持也不好。在应用端用 Java 实现因为编码难度过高还要强依赖数据库,大量历史数据存储在数据库中不仅 IO 效率低,性能也很差。

使用集算器 SPL 可以彻底解决这些问题。集算器是一款开源数据计算引擎,提供了丰富的计算类库和敏捷 SPL 语法可以快速、高效完成数据处理。集算器支持多种数据源,重要的是,集算器还提供了跨数据源的计算能力,这样就可以同时基于分析库和业务库进行混合查询实现 T+0。


A


1

=cold=db1.cursor(“select * from orders where odate< ?”,date(now()))

/ 历史冷数据从分析库中读取

2

=hot=db2.cursor(“select * from orders where odate>=?”,date(now()))

/ 当期热数据从生产库中读取

3

=[cold,hot].conjx()


4

=A3.groups(area,customer;sum(amout):amout)


更进一步,为了解决数据库容量和性能问题,将历史冷数据存储到文件系统中,可以获得更高的 IO 性能和运算性能。而且历史数据写入文件效率也更高。通过集算器完成文件(历史冷数据)和业务数据库(当期热数据)混合计算实现性能更高的 T+0 查询。SPL 写法也很简单,将前面基于数据库的脚本稍稍改造(只改第一行)即可:


A


1

=cold=file(“/his/orders.btx”).cursor@b()

/ 历史冷数据从文件中读取


剩下的部分与前面完全一样


SPL 语法简洁且性能更高,无论是在算法实现上还是运算性能方面都比 SQL 更有优势。SPL 是解释执行的,支持热部署 / 热切换运维也更方便。SPL 还可以作为嵌入式 JDBC 与应用集成使用,应用结构无需调整,使用简单灵活。