-
1、前言
在线分析系统(OLAP)将已有的数据通过运算公式和转换规则聚合出信息,因此OLAP引擎应该至少能够进行:
- 一个或多个维度对数据进行提取、聚合、合计和预计算;
- 一个或多个维度进行逻辑运算、公式等方式的处理;
- 灵活的浏览分析,如一维和多维旋转、交叉表分析、上下钻取等;
Elasticsearch(ES)的聚合功能提供了多级分组和统计的能力。聚合类似关系数据库中group by的的功能,在ES中,一次查询中可以使用多维度聚合,这是一个很有用的功能,可以实现如下图所示的功能:
(图一)
Mondrian是一个开放源代码的ROLAP服务器,使用java开发的。它实现了xmla和jolap规范,而且自定义了一种使用mdx语言的客户端接口。Mondrian是olap服务器,而不是数据仓库服务器,因此Mondrian的元数据主要包括OLAP建模的元数据,不包括从外部数据源到数据库转换的元数据。也就是说Mondria的元数据仅仅包括了多维逻辑模型,从关系型数据库到多维逻辑模型的映射,存取权限等信息。在功能上,Mondrian支持共享维和成员计算,支持星型模型和雪花模型的功能。
2、SQL4ES数据链接
本例中使用的是SQL4ES,开源项目位于Github,访问地址如下https://github.com/Anchormen/sql4es
Class.forName("nl.anchormen.sql4es.jdbc.ESDriver");
Connection con = DriverManager.getConnection("jdbc:sql4es://localhost:9300/myidx?cluster.name=your-cluster-name");
Statement st = con.createStatement();
// execute a query on mytype within myidx
ResultSet rs = st.executeQuery("SELECT * FROM mytype WHERE something >= 42");
ResultSetMetaData rsmd = rs.getMetaData();
int nrCols = rsmd.getColumnCount();
// get other column information like type
while(rs.next()){
for(int i=1; i<=nrCols; i++){
System.out.println(rs.getObject(i));
}
}
rs.close();
con.close();
项目中提供的JDBC驱动,使用DatabaseMetaData和获取数据表的时候有些问题,需要扩展支持。
3、建立SQL4ES的数据链接
如果对SQL4ES开源代码里的JDBC驱动支持的问题进行了修正,将能够建立JDBC链接,并获取元数据信息
(图二:创建ES的JDBC连接)
(图二:测试数据库连接,并使用Druid建立JDBC连接池)
(图三:连接池建立成功)
(图五:自动获取ES数据库表)
(图六:支持SQL的Group操作,汇总数据)
SQL4ES开源项目中的代码支持基本的SQL操作,但不支持JOIN,R3对SQL4ES做了部分扩展,实现了支持多表关联和部分Mondrain中经常使用的CASE WHEN语法。