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

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

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

    本站不再更新,歡迎光臨 java開發(fā)技術(shù)網(wǎng)
    隨筆-230  評論-230  文章-8  trackbacks-0
     

    一、引言

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

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

    Mondrian是一個(gè)開源項(xiàng)目。一個(gè)用Java寫成的OLAP(在線分析性處理)引擎。它用MDX語言實(shí)現(xiàn)查詢,從關(guān)系數(shù)據(jù)庫(RDBMS)中讀取數(shù)據(jù)。然后經(jīng)過Java API用多維的方式對結(jié)果進(jìn)行展示。

    我們都知道,在線分析處理(OLAP)要實(shí)時(shí)地分析大量數(shù)據(jù)。“online”這個(gè)詞的含義就是即使相關(guān)的數(shù)據(jù)量是巨大的——可能以GB為單位——系統(tǒng)也要足夠快的響應(yīng)以顯示結(jié)果。

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

     

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

    二、感性認(rèn)識(shí)——運(yùn)行一個(gè)小實(shí)例

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

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

    當(dāng)然,讀者完全可以運(yùn)行mondrian自帶的實(shí)例,不過這個(gè)例子有些紛繁復(fù)雜,除了Mondrian本身還有其它技術(shù)在里面,不大容易講清楚,也不太適合初學(xué)者學(xué)習(xí)。所以,筆者在這里設(shè)計(jì)一個(gè)簡潔干凈的最小化實(shí)例。

    本文所闡述的實(shí)例環(huán)境是Windows2000+Tomcat+Oracle。并且認(rèn)為讀者已經(jīng)針對jdk和Tomcat做了正確的開發(fā)環(huán)境的設(shè)置。

    21準(zhǔn)備工作

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

    mondrian.war"WEB-INF"lib"mondrian.jar,javacup.jar, xalan.jar,junit.jar等相關(guān)的jar包c(diǎn)opy到%TOMCAT_HOME%"webapps"mywebapp"lib"下。

    22數(shù)據(jù)庫結(jié)構(gòu)

    在這個(gè)tiny的系統(tǒng)中,數(shù)據(jù)庫有3個(gè)表tb_employee(職員表),tb_time(時(shí)間表),tb_salary(薪酬表)。表結(jié)構(gòu)如下:

    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,        --時(shí)間id

        the_year char(4),       --

        the_month char(2)        --

    );

    drop table tb_salary;

    create table tb_salary

    (

        employee_id number,                --職員id   

        time_id      number,                --時(shí)間id

        salary       number(19,4)           --薪酬

    );

    當(dāng)然,為了使系統(tǒng)能夠運(yùn)行,還需要讀者向數(shù)據(jù)庫表中插入一些數(shù)據(jù)。

    23根據(jù)數(shù)據(jù)庫表的結(jié)構(gòu),書寫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運(yùn)行

    這時(shí)啟動(dòng)tomcat,在瀏覽器地址欄中輸入

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

    三、深入探討

    31 API

    mondrian為客戶端應(yīng)用程序提供了API接口以進(jìn)行查詢。 而這些API對于任何用過JDBC的人都會(huì)覺得似曾相識(shí)的。主要的不同點(diǎn)是查詢語言的不同:Mondrian用的是MDX('Multi-Dimensional eXpressions'),JDBC則用的是SQL

    JDBC一樣,也是要經(jīng)過建立連接,形成查詢語句,執(zhí)行查詢得到結(jié)果集等幾個(gè)步驟的。

    我們來看看mondriantest.jsp的代碼

    第1行:import mondrian.olap.*

    這是引入我們所需的類,下面要用到的DriverManager、Connection、Query、Result都在這個(gè)package內(nèi)。這個(gè)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創(chuàng)建一個(gè)Connection的實(shí)例,建立起數(shù)據(jù)庫連接。

    其中Jdbc=jdbc:oracle:thin:@xxx.xxx.xxx.xxx:1521:dbname; 是設(shè)置數(shù)據(jù)庫的ip和庫名。JdbcUser=dbuser; 設(shè)置數(shù)據(jù)庫用戶。JdbcPassword=dbpasswd;   設(shè)置用戶密碼。而

    Catalog=file:///c:/Tomcat4.1/webapps/mywebapp/WEB-INF/mondriantest.xml; 就是設(shè)置MDX語句查詢要對應(yīng)的schema文件的路徑

    第3行:String queryStr=

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

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

    from CubeTest ";

    形成MDX的查詢語句。MDX語句的形式和schema文件的設(shè)定是密切相關(guān)的,當(dāng)然schema文件的形成也是由數(shù)據(jù)庫結(jié)構(gòu)決定的。

    第4行:Query query =connection.parseQuery(queryStr);對MDX語句進(jìn)行分析處理,是否符合schema文件定義、數(shù)據(jù)庫結(jié)構(gòu)和數(shù)據(jù)庫數(shù)據(jù)。

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

    我們發(fā)現(xiàn)Query類似于JDBC的Statement,而Result則酷似于ResultSet。

    32 schema

    321什么是schema

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

    schema文件就是編輯這個(gè)schema的一個(gè)xml文件。在這個(gè)文件中形成邏輯模型和數(shù)據(jù)庫物理模型的對應(yīng)。

    322 schema的邏輯結(jié)構(gòu)

    3221 Cube

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

    例:

    <Cube name="CubeTest">

        <Table name="TB_SALARY" />

       …….

    </Cube>

    <Table>標(biāo)簽確定了所用的事實(shí)表的表名。

    3222 Measure

    一個(gè)度量,簡單的說,就是要被計(jì)算的值。

    例:

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

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

    3223 Dimenesion

    而維度一般有其相對應(yīng)的維度表。

    例:

    <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>標(biāo)簽的foreignKey是事實(shí)表中的字段,<Hierarchy>標(biāo)簽的primaryKey是維度表中的字段,通過這種方式把事實(shí)表和維度表關(guān)聯(lián)起來。<Hierarchy>標(biāo)簽下的<Table>標(biāo)簽就指明了維度表名。而若干個(gè)Level對應(yīng)著維度表的若干字段。

    33 MDX語言

    MDX是為了查詢多維數(shù)據(jù)的,而SQL是為了查詢關(guān)系數(shù)據(jù)庫的。而Mondrian所涉及到的一些MDX概念、MDX語法以及系統(tǒng)定義的MDX函數(shù)和微軟的MDX十分接近,差別微小。完全可以參考微軟的幫助文檔進(jìn)行學(xué)習(xí)。在此就不在贅述。MDX語言基本上已成為多維數(shù)據(jù)庫查詢語言的標(biāo)準(zhǔn)。

    四、結(jié)語

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

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

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

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


    網(wǎng)站導(dǎo)航:
     
    本站不再更新,歡迎光臨 java開發(fā)技術(shù)網(wǎng)
    主站蜘蛛池模板: 二区久久国产乱子伦免费精品| 亚洲色成人四虎在线观看| 一级免费黄色大片| 亚洲日韩中文字幕| 久9久9精品免费观看| 亚洲精品自在在线观看| 一个人免费视频在线观看www| 久久免费观看国产精品| 久久久久亚洲精品美女| 亚洲爆乳大丰满无码专区| 成人爱做日本视频免费| 久久亚洲AV成人无码电影| 日韩内射激情视频在线播放免费| 国产网站在线免费观看| 国产尤物在线视精品在亚洲| 亚洲精品无码永久在线观看| 亚洲一区在线免费观看| 天天摸天天操免费播放小视频| 国产亚洲综合久久| 亚洲色无码专区在线观看| 国产成人 亚洲欧洲| 亚洲一区无码精品色| 性无码免费一区二区三区在线| 亚洲人成在线精品| www.亚洲色图.com| 亚洲AV无码片一区二区三区| 亚洲日本一区二区一本一道 | 黄页网站免费观看| 亚洲av无码一区二区三区四区| 亚洲熟女乱综合一区二区| 99久久国产免费中文无字幕| 亚洲色大成网站www久久九 | 99国产精品视频免费观看| 亚洲性色AV日韩在线观看| 国产亚洲精午夜久久久久久| 精品无码无人网站免费视频| 久久精品国产亚洲| 女人18毛片a级毛片免费视频| 两个人日本WWW免费版| 亚洲综合色自拍一区| 久久青草免费91线频观看站街|