1
回答
Mondrain使用SQL驱动Elasticsearch实现多维数据分析
华为云4核8G,高性能云服务器,免费试用   
  • 1、前言

    在线分析系统(OLAP)将已有的数据通过运算公式和转换规则聚合出信息,因此OLAP引擎应该至少能够进行: 

  1. 一个或多个维度对数据进行提取、聚合、合计和预计算;
  2. 一个或多个维度进行逻辑运算、公式等方式的处理; 
  3. 灵活的浏览分析,如一维和多维旋转、交叉表分析、上下钻取等; 

    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语法。

举报
R3商业智能
发帖于1年前 1回/1K+阅
顶部