BI 前端实践 13:语义层把多库联合起来做多维分析

实践目标

         大数据时,可能被分割开存入多个数据库中以分摊计算量,这些数据库可能因为设计作用不同(比如是当期库和历史数)而导致其数据结构不一定完全相同。用元数据可以把它们统一映射成一个逻辑表,DQL Server将实时向各个分库发出SQL执行,取得结果数据再联合起来,给前端多维分析提供数据。

多版本迭代的项目数据

         一个长期运营的项目,数据结构会存在迭代现象。比如不再发生变动的历史数据用另外的数据库存储;又或者数据结构随业务发生了变动或更换了数据库,用新结构的数据库存储以后的数据。

        新版本数据结构的命名规则也可能变化,字段含义相同,但字段名不同。

        尽管不同版本存在着异名、异库的情况,但多个版本的数据仍然是一个整体,做多维分析时。要么通过ETL预先的把数据整理到一起;要么通过程序动态的汇总数据;基于DQL语义层的多库多维分析,采用后一种方案。

 

        下面是测试数据,来自历史库historyDbordershistory/来自当前运营库ordersorders表,它们的订单数据范围不同,字段命名也不同:

..

..

用元数据规范多库不同版本的表

         一个元数据文件描述一个实体数据库,下面用orders.lmd描述orders库,用ordersHis.lmd描述historyDb库,订单表在两个库中的表名(orders/ordershistory)、字段名(orderId/order_id)不相同,但在两个元数据中都规范成了相同的名称,比如订单ID(orderId/order_id)

..

..

 

多库表元数据组合成一个DQL服务

         DQL Server中,可以把上面两个元数据(多个同结构的元数据也行)部署成一个DQL服务。在{润乾报表根目录}/report/services/server.xml中通过设置mdb=”true”表明这是一个多库服务,raqsoftConfig是运行环境配置文件:

..

         raqsoftConfig.xml配置文件中配置两个实体数据库的JDBC连接ordersHisJDBCordersJDBC(这里用的两个示例库都是mysql的,根据润乾官网文档的说明,把其中一个换成oracle也能支持)

..

         然后配置这个多库DQL服务的配置文件{润乾报表根目录}/report/services/orders/service.xml,在MAP节点下配置每个实体数据库及其元数据文件,ordersJDBC连接的orders库对应orders.lmdordersHisJDBC连接的historyDb库对应ordersHis.lmd(元数据文件都在……/conf/目录下)

..

         这样多库DQL服务就配置好了,保存配置后重启,这个多库DQL服务orders就可以用于多维分析了,而前端的多维分析不需知道orders服务是不是多库的。

基于多库表DQL服务做多维分析

        多维分析中的订单表的数据,已经是两个库的合集了:

..

         做分组汇总,也是两个库的合集数据(每个库表11个订单,一共22)

..