hengheng123456789

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            297 Posts :: 68 Stories :: 144 Comments :: 0 Trackbacks

          一、引言

          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。并且認為讀者已經針對jdkTomcat做了正確的開發環境的設置。

          2 1 準備工作

          %Tomcat%/webapp依次建立mywebappmywebapp/WEB-INFmywebapp/WEB-INF/lib, mondrian.jar,javacup.jar, x alan.jar,junit.jar 等相關的jarcopy % TOMCAT_HOME%/ webapps/mywebapp/lib 下。

          2 2 數據庫結構

          在這個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)?????????? -- 薪酬

          );

          ?

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

          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");

          %>

          2 5 運行

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

          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.*

          這是引入我們所需的類,下面要用到的DriverManagerConnectionQueryResult都在這個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類似于JDBCStatement,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 的共同地方就是共用一個事實表。

          例:

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

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

          3 3 MDX 語言

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

          四、結語

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

          posted on 2006-12-01 16:55 哼哼 閱讀(2213) 評論(3)  編輯  收藏 所屬分類: BI

          Feedback

          # re: Pentaho之mondrian“藝術家” 2008-01-10 09:57 wdmcln@dsy
          你的msn是多少,想和你交流一下?
          我做的mondrian例子,不能輸出結果集,沒有達到網上說的那種效果!
          在單步測試的時候,已經看維度里面有值,找了好久,也沒找到怎么輸出結果集的方法
          PrintWriter pw = new PrintWriter(System.out);
          result.print(pw);
          這樣沒有任何輸出,希望到得到作者的幫助!
          我的msn:wdmcln@hotmail.com  回復  更多評論
            

          # re: Pentaho之mondrian“藝術家” 2009-02-16 09:56 pentaho
          pentaho中文社區挺不錯的,里面有很多pentaho和其它商業智能產品的資料,推薦去看看,地址是www.pentahoclub.cn  回復  更多評論
            

          # re: Pentaho之mondrian“藝術家” 2011-07-28 17:18 alishan212
          Pentaho QQ 群, Pentaho China

          Weclome to join in Pentaho Projects in China, we would like to share any experience with you and get cooperations each other.

          Pentaho 項目群成立了,歡迎有識之士加入,共同討論分享 Pentaho 經驗和 項目合作。

          Pentaho 項目 QQ群: 164774111
            回復  更多評論
            

          主站蜘蛛池模板: 西吉县| 师宗县| 吴江市| 乳山市| 泗洪县| 张掖市| 泰安市| 潼南县| 贵德县| 阿拉善盟| 大理市| 炉霍县| 建始县| 新化县| 琼海市| 平度市| 米泉市| 麻城市| 满城县| 龙川县| 交口县| 浠水县| 延安市| 长乐市| 广东省| 清水县| 容城县| 项城市| 北流市| 昭通市| 石狮市| 淮南市| 黄梅县| 清远市| 蓬溪县| 长葛市| 上犹县| 东辽县| 涞源县| 会宁县| 耒阳市|