本站不再更新,歡迎光臨 java開發技術網
          隨筆-230  評論-230  文章-8  trackbacks-0
           

          一、引言

          Mondrian, 蒙得里安·皮特1872-1944荷蘭畫家,作品以交錯的三原色為基色的垂直線條和平面為特點,他的著作包括 新造型主義(1920年),對抽象藝術的發展曾經產生很深影響。——金山詞霸如是說。

          不過,本文所要討論的可不是這位藝術家。那到底mondrian是什么呢?

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

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

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

           

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

          二、感性認識——運行一個小實例

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

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

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

          本文所闡述的實例環境是Windows2000+Tomcat+Oracle。并且認為讀者已經針對jdk和Tomcat做了正確的開發環境的設置。

          21準備工作

          在%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"下。

          22數據庫結構

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

          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(19,4)           --薪酬

          );

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

          23根據數據庫表的結構,書寫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

          24利用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");

          %>

          25運行

          這時啟動tomcat,在瀏覽器地址欄中輸入

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

          三、深入探討

          31 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。

          32 schema

          321什么是schema

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

          schema文件就是編輯這個schema的一個xml文件。在這個文件中形成邏輯模型和數據庫物理模型的對應。

          322 schema的邏輯結構

          3221 Cube

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

          例:

          <Cube name="CubeTest">

              <Table name="TB_SALARY" />

             …….

          </Cube>

          <Table>標簽確定了所用的事實表的表名。

          3222 Measure

          一個度量,簡單的說,就是要被計算的值。

          例:

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

          <Measure>標簽有3個必要的屬性name(度量名),column(在事實表中的字段名), aggregation(聚合所用的方法)。

          3223 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)組成。

          <Dimension>標簽的foreignKey是事實表中的字段,<Hierarchy>標簽的primaryKey是維度表中的字段,通過這種方式把事實表和維度表關聯起來。<Hierarchy>標簽下的<Table>標簽就指明了維度表名。而若干個Level對應著維度表的若干字段。

          33 MDX語言

          MDX是為了查詢多維數據的,而SQL是為了查詢關系數據庫的。而Mondrian所涉及到的一些MDX概念、MDX語法以及系統定義的MDX函數和微軟的MDX十分接近,差別微小。完全可以參考微軟的幫助文檔進行學習。在此就不在贅述。MDX語言基本上已成為多維數據庫查詢語言的標準。

          四、結語

          Mondrian作為基于java的OLAP引擎,而且是開源的項目,為那些基于java的項目而要脫離微軟構架但又不得不對大量數據進行分析的項目又提供了一種可行的方案。希望它也能象蒙得里安·皮特對抽象藝術的發展產生影響一樣起到一定的作用。

          posted on 2008-04-17 13:29 有貓相伴的日子 閱讀(11952) 評論(6)  編輯  收藏 所屬分類: BI

          評論:
          # re: java開源的OLAP引擎--mondrian 2008-04-17 15:37 | klzz
          嗯,開源的OLAP,小型項目的選擇!  回復  更多評論
            
          # re: java開源的OLAP引擎--mondrian[未登錄] 2008-04-18 10:47 | kebo
          學學知識還可以,要上oalp的公司,絕不在乎上一個商業的olap引擎  回復  更多評論
            
          # re: java開源的OLAP引擎--mondrian 2008-04-18 20:41 | 一手的小窩窩
          值得學習。算是比較深的東西了。  回復  更多評論
            
          # re: java開源的OLAP引擎--mondrian 2008-04-20 11:47 | peidw
          @kebo
          oracle本身就提供了olap 的引擎  回復  更多評論
            
          # re: java開源的OLAP引擎--mondrian 2008-05-25 14:48 | 有貓相伴的日子

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          本站不再更新,歡迎光臨 java開發技術網
          主站蜘蛛池模板: 聊城市| 繁昌县| 凯里市| 招远市| 阳信县| 西安市| 彰化县| 曲阜市| 许昌市| 江城| 绩溪县| 措勤县| 司法| 海阳市| 五莲县| 青川县| 册亨县| 和政县| 拜城县| 汾阳市| 侯马市| 甘南县| 海伦市| 临江市| 南宫市| 疏勒县| 仲巴县| 张家界市| 邵武市| 柳林县| 措美县| 巴东县| 黄山市| 秀山| 偃师市| 正定县| 吉水县| 固原市| 额尔古纳市| 珲春市| 荣成市|