开源 BI 实践:整库查询

前面讲过的用数据文件、手写 SQL 都只是针对一个数据集做分析,但 BI 用户常常需要自由的分析,数据库里有很多表,要能够随意选取来做分析。

DQL 服务通过 JDBC 方式能够提供全库多表查询,下面我们尝试制作 DQL 语义层、部署 DQL 服务,然后在 BI 界面实现全库选表做多维分析。

制作 DQL 语义层

下面以 Mysql 的 tpch 库数据为例,打开 DQL 设计器:{润乾报表根目录}/bin/dql.exe,新建一个语义层元数据:

..

在菜单“系统→数据源”里创建 tpch 数据源:

..

然后连接上 tpch 数据源(连接成功后变为粉色):

..

之后就可以直接选择整个数据库的表导入 (系统→导入数据库表):

..

设置完成后,可以尝试执行 DQL(系统→翻译 DQL),能看到 DQL 被翻译成了 SQL,并且查询出了数据,这个简单查询语句的语法看起来和 SQL 一样,实际上它是 DQL 语句,以后涉及多表关联查询时,就会看出显著差异,现在先把它当 SQL 用:

..

部署配置 DQL 查询服务

在设计器里完成了语义层元数据的制作,经过测试也能正确执行 DQL 语句了。

下一步把它部署为 DQL 服务,就能用 JDBC 方式给 WEB 端提供 DQL 查询服务了。

{润乾报表安装根目录}/services 下每个文件夹是一个 DQL 服务,默认有 datalogic 服务,我们新建一个 tpch 文件夹,把上面做好的 tpch.lmd 放到 services/tpch/conf 目录下:

..

然后新建这个服务的配置文件 services/tpch/service.xml,指定语义层元数据文件 tpch.lmd,并配置原始 Mysql 数据库连接:

<?xml version="1.0" encoding="UTF-8"?>

<SERVICE logicmetadata="tpch.lmd">

 <DB type="MYSQL">

  <CONNECTION name="db1" type="jdbc" url="jdbc:mysql://127.0.0.1:3306/tpch"

   driver="com.mysql.jdbc.Driver" user="root" password="123456"/>

 </DB>

 <USERS>

  <USER name="root" password="root">

   <CONNECTION name="db1"/>

  </USER>

 </USERS>

</SERVICE>

再编辑 DQL Server 的配置文件 services/server.xml,增加 tpch 服务:

..

这样就配置完成了,然后启动 ${润乾报表安装根目录}/bin/startDQLSERVER.bat,看到 datalogic、tpch 两个服务都成功启动了:

..

BI 界面中整库查询

先把 DQL 服务的 JDBC 数据源配置到 WEB 里的配置文件 {WEB 应用根目录}/WEB-INF/raqsoftConfig.xml 里,连接 URL 为 jdbc:datalogic://127.0.0.1:3366/tpch,指明连接 DQL Server 的 tpch 服务,连接的驱动类是 com.datalogic.jdbc.LogicDriver:

……

<DB name="TPCH">

 <property name="url" value="jdbc:datalogic://127.0.0.1:3366/tpch"/>

 <property name="driver" value="com.datalogic.jdbc.LogicDriver"/>

 <property name="type" value="16"/>

 <property name="user" value="root"/>

 <property name="password" value="root"/>

</DB>

……

BI 界面中在 URL 里指定使用这个 DQL 类型的数据源 (TPCH),元数据里整库的表就会都展示到界面上,用户可以自由选择想查询的表及字段:

..

预定义计算字段

元数据里还可以定义计算字段,把基础信息预先加工出更多用于多维分析的信息:

..

计算出的成交价格 (DEALPRICE),也能像普通字段一样查询:

..

将表和字段显示成业务术语

要把数据库里的表、字段名替换成业务术语,在每次查询时写 AS 别名比较繁琐,DQL 提供字典 (*.dct) 可以预先定义所有表、字段的别名。元数据生成字典很简单,打开元数据文件 (tpch.lmd) 后,从菜单栏选择:系统 → 生成字典:

..

生成的字典文件保存为 tpch.dct,可以看到元数据里的表、字段都导入进来了,然后这里定义所有表和字段的别名即可:

..

把 tpch.dct 放入 {WEB 根目录}/WEB-INF/files/dql/ 目录下,然后在 olap.jsp 里用 JS 代码引入字典文件即可:

<script>

guideConf.dct="tpch.dct";

</script>

再访问 BI 页面,看到是中文表名、字段名了:

..

设置默认显示格式

上面的订单日期显示格式是 yyyy-MM-dd,在字典里可以修改这个默认的显示格式:

..

再选出订单日期时,就是新的显示格式 yyyy 年 MM 月 dd 日了:

..

用 DQL 维度把代码值显示成名称

元数据中各个表的主键是可以用作分组的维度,也叫主键维。然后在字典中对这些维字段设置显示列之后,多维分析时就会自动把代码值显示成名称值。先在元数据里设置所有表的主键:

..

设置完主键后,在视图模式下能看到中间的主键维:

..

看上面的维,可以看到有几组重复的:
lineitem_L_ORDERKEY / orders_O_ORDERKEY

lineitem_L_PARTKEY / part_P_PARTKEY / partsupp_PS_PARTKEY

lineitem_L_SUPPKEY / partsupp_PS_SUPPKEY / supplier_S_SUPPKEY

把关联表的外键设置补上后,就会消除这些重复维度,比如 lineitem 表里 L_ORDERKEY、L_PARTKEY、L_SUPPKEY 字段分别外键到 orders、part、supplier 三个表的主键:

..

设置完外键,消除了重复维度:

..

元数据中新增了维度,可以把元数据的更新追加导入到字典里,打开 tpch.dct,选择系统 → 导入元数据,更新成功后看到维度也导入进来了:

..

然后设置维度为中文标题,并且国家维的显示列设置为国家名、区域维的显示列设置为区域名:

..

BI 页面再看客户表的国家编号,自动替换成了国家名称:

..

维度控制所有维字段显示风格

多个表中都存在日期字段,如果想统一控制所有日期字段的显示风格,可以用日期维控制,但数据库中通常不存在以日期为主键的维表,这时可以在元数据中定义“日期”假表,把日期维创造出来:

..

然后设置所有表的日期字段外键到日期表,比如 lineitem 表里的 L_SHIPDATE、L_COMMITDATE、L_RECEIPTDATE 都外键到日期表的主键:

..

把新的日期假表、日期维同步到字典后,在日期主键字段上设置显示风格:

..

再查询任意的日期字段,就都继承日期维的显示风格了:

..

后记

本篇文章了解了 DQL 语义层的制作、部署以及使用。数据库结构在较长时间里通常比较稳定,通过一次性定义语义层,改善后续长久的查询体验。

现在已经能基于 DQL 服务在整库中自由选表查询数据了,但上面只关注了单表的功能,而常规的多维分析需求往往涉及多表关联,下一篇我们将结合多维分析实际需求,详细介绍 DQL 怎么理解关联,与 SQL 关联的差异对 BI 用户会产生怎样的影响。