java 之OLAP引擎Mondrian

來源:互聯網
上載者:User

Mondrian是一個開源項目。一個用Java寫成的OLAP(線上分析性處理)引擎。它用MDX語言實現查詢,從關聯式資料庫(RDBMS)中讀取資料。然後經過Java API用多維的方式對結果進行展示。

我們都知道,線上分析處理(OLAP)要即時地分析大量資料。“online”這個詞的含義就是即使相關的資料量是巨大的——可能以GB為單位——系統也要足夠快的響應以顯示結果。

OLAP用了多維分析的技術。儘管關係型資料庫所儲存的所有資料都是以行和列的形式存在的,但一個Cube還是可以由軸(axes)和單元(cell)組成。

圖1

在上面的例子中,時間是個維度(dimension),而它下面的層次(Hierarchies)又分為半年、季度等層級(Level)。

二、感性認識——運行一個小執行個體

我們暫時先不討論Mondrian所用到的一些技術。我們可以先從一個小例子開始,不必在意每個細節,只是希望大家有個感性認識先。在實施這個例子的過程中,或許讀者就能見些端倪。

首先應該到http://sourceforge.net/projects/mondrian/下載mondrian的最新版本。這是一個zip包,包括我們要用到的lib和一個例子。

當然,讀者完全可以運行mondrian內建的執行個體,不過這個例子有些紛繁複雜,除了Mondrian本身還有其它技術在裡面,不大容易講清楚,也不太適合初學者學習。所以,筆者在這裡設計一個簡潔乾淨的最小化執行個體。

本文所闡述的執行個體環境是Windows2000+Tomcat+Oracle。並且認為讀者已經針對jdk和Tomcat做了正確的開發環境的設定。

2.1準備工作

在%Tomcat%"webapp"依次建立mywebapp,mywebapp"WEB-INF,mywebapp"WEB-INF"lib,把

mondrian.war"WEB-INF"lib"mondrian.jar,javacup.jar, xalan.jar,junit.jar等相關的jar包copy到%TOMCAT_HOME%"webapps"mywebapp"lib"下。

2.2資料庫結構

在這個tiny的系統中,資料庫有3個表tb_employee(職員表),tb_time(時間表),tb_salary(薪酬表)。表結構如下:

Oracle
drop table tb_employee;

create table tb_employee(employee_id     number,             --職員id    

employee_name   varchar2(10)        --職員姓名);

drop table tb_time;

create table tb_time(time_id   number,        --時間id

the_year char(4),       --年

the_month char(2)        --月);

drop table tb_salary;

create table tb_salary(employee_id number,                --職員id   

 time_id      number,                --時間id

salary       number(1)

);

 

MS SQL 2000

create table tb_employee(employee_id bigint,--職員id
employee_name varchar(10) --職員姓名
)
create table tb_time(time_id bigint,--時間id

the_year varchar(4),     --年
the_month varchar(2)           --月
)
create table tb_salary(employee_id bigint, --職員id
time_id int, --時間
idsalary smallint
)

當然,為了使系統能夠運行,還需要讀者向資料庫表中插入一些資料。

2.3根據資料庫表的結構,書寫schema檔案

< ?xml version="1.0"?>
< Schema name="Mondrian">
< Cube name="CubeTest">
    < Table name="TB_SALARY" />
    < Dimension name="Employee" foreignKey="EMPLOYEE_ID" >
        < Hierarchy hasAll="true" primaryKey="EMPLOYEE_ID">       
            < Table name="TB_EMPLOYEE" />
        < Level name="employeeId" column="EMPLOYEE_ID" uniqueMembers="true" >
                < Property name="employeeName" column="EMPLOYEE_NAME"/>
            < /Level>
        < /Hierarchy>
    < /Dimension>
    < Dimension name="Time" foreignKey="TIME_ID" >
        < Hierarchy hasAll="false" primaryKey="TIME_ID" >
            < Table name="TB_TIME" />
            < Level name="year" column="THE_YEAR" uniqueMembers="false" />
            < Level name="month" column="THE_MONTH" uniqueMembers="false" />
        < /Hierarchy>
    < /Dimension>      

    < Measure name="Salary" column="SALARY" aggregator="sum" />
    < /Cube>
< /Schema>
 

檔案路徑為mywebapp"WEB-INF"mondriantest.xml

2.4利用MDX查詢

mywebapp"mondriantest.jsp
1 < %@ page import="mondrian.olap.*"%>
< %
2 Connection connection =
 DriverManager.getConnection
("Provider=mondrian;               
 Jdbc=jdbc:oracle:thin:@xxx.xxx.xxx.xxx:1521:dbname;
JdbcUser=dbuser;                                   
 JdbcPassword=dbpasswd;                              
Catalog=file:///c:/Tomcat4.1/webapps/mywebapp/WEB-INF/mondriantest.xml;
JdbcDrivers=oracle.jdbc.driver.OracleDriver;",null,false);   
3 String queryStr=
"select {[Measures].[Salary]} ON COLUMNS,
{[Employee].[employeeId].Members} ON ROWS
from CubeTest ";
4 Query query =connection.parseQuery(queryStr);
5 Result result = connection.execute(query);
out.println("get result");
%>
這時啟動tomcat,在瀏覽器地址欄中輸入

http://localhost:8080/mywebapp/ mondriantest.jsp即可。

三、深入探討

3.1 API

mondrian為用戶端應用程式提供了API介面以進行查詢。 而這些API對於任何用過JDBC的人都會覺得似曾相識的。主要的不同點是查詢語言的不同:Mondrian用的是MDX('Multi-Dimensional eXpressions'),而JDBC則用的是SQL。

和JDBC一樣,也是要經過建立串連,形成查詢語句,執行查詢得到結果集等幾個步驟的。

我們來看看mondriantest.jsp的代碼

第1行:import mondrian.olap.*

這是引入我們所需的類,下面要用到的DriverManager、Connection、Query、Result都在這個package內。這個package一般位於mondrian.jar中。

第2行:Connection connection =

DriverManager.getConnection

("Provider=mondrian;                

Jdbc=jdbc:oracle:thin:@xxx.xxx.xxx.xxx:1521:dbname;

JdbcUser=dbuser;                                    

JdbcPassword=dbpasswd;                               

Catalog=file:///c:/Tomcat4.1/webapps/mywebapp/WEB-INF/mondriantest.xml;

JdbcDrivers=oracle.jdbc.driver.OracleDriver;",null,false);

通過DriverManager建立一個Connection的執行個體,建立起資料庫連接。

其中Jdbc=jdbc:oracle:thin:@xxx.xxx.xxx.xxx:1521:dbname; 是設定資料庫的ip和庫名。JdbcUser=dbuser; 設定資料庫使用者。JdbcPassword=dbpasswd;   設定使用者密碼。而

Catalog=file:///c:/Tomcat4.1/webapps/mywebapp/WEB-INF/mondriantest.xml; 就是設定MDX語句查詢要對應的schema檔案的路徑

第3行:String queryStr=

"select {[Measures].[Salary]} ON COLUMNS,

{[Employee].[employeeId].Members} ON ROWS

from CubeTest ";

形成MDX的查詢語句。MDX語句的形式和schema檔案的設定是密切相關的,當然schema檔案的形成也是由資料庫結構決定的。

第4行:Query query =connection.parseQuery(queryStr);對MDX語句進行分析處理,是否符合schema檔案定義、資料庫結構和資料庫資料。

第5行:Result result = connection.execute(query);執行查詢,得到結果集。

我們發現Query類似於JDBC的Statement,而Result則酷似於ResultSet。

3.2 schema

3.2.1什麼是schema

schema定義了一個多維資料庫。包含了一個邏輯模型,而這個邏輯模型的目的是為了書寫MDX語言的查詢語句。這個邏輯模型實際上提供了這幾個概念:Cubes,維度(Dimensions), 層次(Hierarchies),層級(Levels),和成員(Members)。

而schema檔案就是編輯這個schema的一個xml檔案。在這個檔案中形成邏輯模型和資料庫物理模型的對應。

3.2.2 schema的邏輯結構

3.2.2.1 Cube

一個Cube是一系列維度(Dimension)和度量(Measure)的集合地區。在Cube中,Dimension和Measure的共同地方就

的是為了書寫MDX語言的查詢語句。這個邏輯模型實際上提供了這幾個概念:Cubes,維度(Dimensions), 層次(Hierarchies),層級(Levels),和成員(Members)。而schema檔案就是編輯這個schema的一個xml檔案。在這個檔案中形成邏輯模型和資料庫物理模型的對應。

3.2.2 schema的邏輯結構

3.2.2.1 Cube 一個Cube是一系列維度(Dimension)和度量(Measure)的集合地區。在Cube中,Dimension和Measure的共同地方就是共用一個事實表。例: < Cube name="CubeTest">< Table name="TB_SALARY" />…….< /Cube> < Table>標籤確定了所用的事實表的表名。

3.2.2.2 Measure 一個度量,簡單的說,就是要被計算的值。例: < Measure name="Salary" column="SALARY" aggregator="sum" /> < Measure>標籤有3個必要的屬性name(度量名),column(在事實表中的欄位名), aggregation(彙總所用的方法)。

 3.2.2.3 Dimenesion 而維度一般有其相對應的維度資料表。例: < Dimension name="Time" foreignKey="TIME_ID" > < Hierarchy hasAll="false" primaryKey="TIME_ID" > < Table name="TB_TIME" /> < Level name="year" column="THE_YEAR" uniqueMembers="false" /> < Level name="month" column="THE_MONTH" uniqueMembers="false" /> < /Hierarchy> < /Dimension> 一般Dimesion包含層次(Hierarchy),而hierarchy是由層級(Level)組成。 標籤的foreignKey是事實表中的欄位,標籤的primaryKey是維度資料表中的欄位,通過這種方式把事實表和維度資料表關聯起來。< HIERARCHY>標籤下的< TABLE>標籤就指明了維度資料表名。而若干個Level對應著維度資料表的若干欄位。

3.3 MDX語言 MDX是為了查詢多維資料的,而SQL是為了查詢關聯式資料庫的。而Mondrian所涉及到的一些MDX概念、MDX文法以及系統定義的MDX函數和微軟的MDX十分接近,差別微小。完全可以參考微軟的協助文檔進行學習。在此就不在贅述。MDX語言基本上已成為多維資料庫查詢語言的標準。四、結語 Mondrian作為基於java的OLAP引擎,而且是開源的項目,為那些基於java的項目而要脫離微軟構架但又不得不對大量資料進行分析的項目又提供了一種可行的方案。希望它也能象蒙得裡安·皮特對抽象藝術的發展產生影響一樣起到一定的作用。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.