<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    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 哼哼 閱讀(2212) 評論(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
      回復  更多評論
      

    主站蜘蛛池模板: 中文字幕在线观看免费视频| 免费在线精品视频| 亚洲熟女综合色一区二区三区| 国产婷婷高清在线观看免费| 亚洲免费人成在线视频观看| 亚洲人成7777影视在线观看| 亚洲国产精品13p| 在线看片免费人成视久网| 久久精品国产亚洲AV| 亚洲A∨无码一区二区三区| 成年女人免费v片| 99在线免费视频| 亚洲日韩亚洲另类激情文学| 亚洲人成影院在线无码按摩店| 黄页网站免费观看| 皇色在线免费视频| 中文字幕在线观看亚洲视频| 亚洲自偷自偷在线制服| 一二三四免费观看在线电影| 中文字幕在线成人免费看| 亚洲男人天堂2022| 亚洲AV无码欧洲AV无码网站| 国产成人啪精品视频免费网| 182tv免费观看在线视频| 国产精品免费在线播放| 亚洲午夜无码毛片av久久京东热| 亚洲AV无码一区二区二三区入口| 免费永久国产在线视频| 成年女人午夜毛片免费视频| 亚洲免费视频在线观看| A毛片毛片看免费| 国产一区二区三区亚洲综合| 亚洲国产成人精品激情| 亚洲AV日韩AV永久无码免下载| 亚洲成a人片在线观看国产| 好吊妞788免费视频播放| 91短视频在线免费观看| 日韩精品无码免费专区午夜| 一区视频免费观看| 免费大片av手机看片高清| 一级女性全黄生活片免费看|