posts - 310, comments - 6939, trackbacks - 0, articles - 3
            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理
           

          基于開源BI平臺(tái)Openi的數(shù)據(jù)倉(cāng)庫(kù)系統(tǒng)的設(shè)計(jì)開發(fā)

          應(yīng)IT168寫的專稿:http://publish.itpub.net/bi/2007-12-06/200712060945646.shtml

          現(xiàn)在大家比較公認(rèn)的商業(yè)智能系統(tǒng)分為報(bào)表、OLAP、數(shù)據(jù)倉(cāng)庫(kù)、數(shù)據(jù)挖掘和即席查詢五大塊,本身商業(yè)智能系統(tǒng)也只是一個(gè)比較新的概念,也許隨著技術(shù)和應(yīng)用的發(fā)展還會(huì)擴(kuò)充出來很多模塊。本文就基于開源BI平臺(tái)Openi的數(shù)據(jù)倉(cāng)庫(kù)系統(tǒng),進(jìn)行整體設(shè)計(jì)及開發(fā),就其中比較熱門的技術(shù),如OLP、數(shù)據(jù)倉(cāng)庫(kù)等進(jìn)行初步的控告,以期起到一個(gè)拋磚引玉的作用。

          一、        開源的BI平臺(tái)

          商業(yè)智能也稱作BI是英文單詞Business Intelligence的縮寫。商業(yè)智能通常被理解為將企業(yè)中現(xiàn)有的數(shù)據(jù)轉(zhuǎn)化為知識(shí),幫助企業(yè)做出明智的業(yè)務(wù)經(jīng)營(yíng)決策的工具。這里所談的數(shù)據(jù)包括來自企業(yè)業(yè)務(wù)系統(tǒng)的訂單、庫(kù)存、交易賬目、客戶和供應(yīng)商等來自企業(yè)所處行業(yè)和競(jìng)爭(zhēng)對(duì)手的數(shù)據(jù)以及來自企業(yè)所處的其他外部環(huán)境中的各種數(shù)據(jù)。而商業(yè)智能能夠輔助的業(yè)務(wù)經(jīng)營(yíng)決策,既可以是操作層的,也可以是戰(zhàn)術(shù)層和戰(zhàn)略層的決策。為了將數(shù)據(jù)轉(zhuǎn)化為知識(shí),需要利用數(shù)據(jù)倉(cāng)庫(kù)、聯(lián)機(jī)分析處理(OLAP)工具和數(shù)據(jù)挖掘等技術(shù)。因此,從技術(shù)層面上講,商業(yè)智能不是什么新技術(shù),它只是數(shù)據(jù)倉(cāng)庫(kù)、OLAP和數(shù)據(jù)挖掘等技術(shù)的綜合運(yùn)用。

          從國(guó)內(nèi)企業(yè)和政府部門的信息化建設(shè)發(fā)展來看,從最初的各類MIS系統(tǒng)到近幾年流行的ERPCRM等,用戶的數(shù)據(jù)積累已達(dá)到了一定的程度,很多行業(yè)的用戶面對(duì)越來越激烈的市場(chǎng)競(jìng)爭(zhēng),他們需要對(duì)自己的數(shù)據(jù)(用戶、市場(chǎng)、產(chǎn)品)進(jìn)行分析,挖掘出潛在的商機(jī),降低公司的運(yùn)作成本,這是BI和數(shù)據(jù)倉(cāng)庫(kù)類產(chǎn)品被市場(chǎng)看好、不斷獲得增長(zhǎng)的根本原因!

          在現(xiàn)有的市場(chǎng)中,對(duì)于BI類產(chǎn)品來說往往是與數(shù)據(jù)倉(cāng)庫(kù)整體解決方案相關(guān)聯(lián),一些國(guó)內(nèi)的IT公司也正在把BI和數(shù)據(jù)倉(cāng)庫(kù)的結(jié)合作為行業(yè)的解決方案來推廣到自己熟悉的領(lǐng)域。對(duì)于IT公司來說在ERPCRM之后需要尋找新的利潤(rùn)增長(zhǎng)點(diǎn),BI和數(shù)據(jù)倉(cāng)庫(kù)的出現(xiàn)無疑是一個(gè)莫大的商機(jī)。

          在商業(yè)智能系統(tǒng)出現(xiàn)之前,大家都是通過報(bào)表來展現(xiàn)數(shù)據(jù)庫(kù)中的數(shù)據(jù),報(bào)表有簡(jiǎn)單有復(fù)雜,當(dāng)然報(bào)表只能靜態(tài)的展現(xiàn)一部分?jǐn)?shù)據(jù),用戶只能看到已經(jīng)做好的報(bào)表,不能根據(jù)自己的需要重新構(gòu)造報(bào)表。隨著技術(shù)的發(fā)展,出現(xiàn)了OLAP分析,它能夠讓用戶根據(jù)自己的想法對(duì)數(shù)據(jù)進(jìn)行聚類、分類、鉆取等操作,這樣就很好的解決了報(bào)表不能動(dòng)態(tài)展現(xiàn)的問題。之后隨著數(shù)據(jù)倉(cāng)庫(kù)和數(shù)據(jù)挖掘技術(shù)的不斷完善,大家都認(rèn)為商業(yè)智能系統(tǒng)主要是分析數(shù)據(jù),就把OLAP、數(shù)據(jù)倉(cāng)庫(kù)和數(shù)據(jù)挖掘歸類到一起形成了BI系統(tǒng),這三項(xiàng)確實(shí)能夠體現(xiàn)Intelligence的概念。因此初期的BI系統(tǒng)都是只含有這三塊,但是用戶在使用一段時(shí)間后認(rèn)為報(bào)表模塊是必不可少的,因此都紛紛要求BI供應(yīng)商將報(bào)表模塊加進(jìn)來,為什么會(huì)出現(xiàn)這種情況呢?因?yàn)殡m然OLAP能動(dòng)態(tài)展現(xiàn)數(shù)據(jù),但是它主要還是側(cè)重于決策者的分析,而中層領(lǐng)導(dǎo)更喜歡看到的是報(bào)表,他們需要掌握自己所分管部分的運(yùn)營(yíng)情況,報(bào)表則是最好的展現(xiàn)數(shù)據(jù)的方式,因此最后各BI廠商就將報(bào)表也加入到BI系統(tǒng)中去了,例如BO收購(gòu)水晶報(bào)表,Hyperion收購(gòu)Brio等都是BI廠商收購(gòu)報(bào)表廠商來完善自己的報(bào)表功能。

          下面列出相對(duì)成熟和完整,并且有借鑒意義的開源BI套件,而本文中的倉(cāng)庫(kù)系統(tǒng)的設(shè)計(jì)及開發(fā)采用就是其中的Openi這種開源的BI平臺(tái)。
            (1)Bizgres
            為GreenPlum公司主導(dǎo)的開源項(xiàng)目,和Sun公司達(dá)成合作關(guān)系。BizgresBI應(yīng)用而對(duì)PostgreSQL做了優(yōu)化,提高了大負(fù)荷的并行計(jì)算能力,在BI環(huán)境中,相對(duì)于普通的關(guān)系型數(shù)據(jù)庫(kù)具有卓越的數(shù)據(jù)處理性能。Bizgres的數(shù)據(jù)庫(kù)平臺(tái)可以和KETLJasperReports進(jìn)行整合,從而形成一個(gè)BI套件。

          (2)Openi
            是一個(gè)Java開發(fā)的Web應(yīng)用,能對(duì)OLAP服務(wù)器、關(guān)系數(shù)據(jù)庫(kù)和數(shù)據(jù)挖掘服務(wù)器進(jìn)行分析和報(bào)表展示,非常易于使用和部署,界面美觀友好,后續(xù)還將支持?jǐn)?shù)據(jù)挖掘和ETL等。

          (3)Pentaho
            是一個(gè)以工作流為核心的、強(qiáng)調(diào)面向解決方案而非工具組件的BI套件,整合了多個(gè)開源項(xiàng)目,目標(biāo)是和商業(yè)BI相抗衡。它包括。由上可見Pentaho是一個(gè)很完善的BI解決方案。Pentaho偏向于與業(yè)務(wù)流程相結(jié)合的BI解決方案,側(cè)重于大中型企業(yè)應(yīng)用。

          (4)SpagoBI
            SpagoBI 集成了MondrainJProvit,能夠通過OpenLaszlo產(chǎn)生實(shí)時(shí)報(bào)表。SpagoBI使用java開發(fā),不依賴于具體的操作系統(tǒng),有很強(qiáng)的擴(kuò)展能力。根據(jù)其Roadmap可以看出,SpagoBI將融入更多的BI功能,甚至BI之外的功能。

          二、        系統(tǒng)設(shè)計(jì)

          1.系統(tǒng)體系結(jié)構(gòu)

          該系統(tǒng)基與多層體系結(jié)構(gòu)設(shè)計(jì),其中包括:

          WEB客戶端層;

          WEB服務(wù)器層;

          數(shù)據(jù)持久層。


          系統(tǒng)多層體系結(jié)構(gòu)圖

          2.系統(tǒng)數(shù)據(jù)流程

          下面我們來介紹一下數(shù)據(jù)倉(cāng)庫(kù)系統(tǒng)的數(shù)據(jù)流程,以此來讓用戶更好的把握產(chǎn)品的整體架構(gòu)和功能原理。下圖為系統(tǒng)的數(shù)據(jù)流程與相關(guān)功能關(guān)系圖。


          數(shù)據(jù)倉(cāng)庫(kù)系統(tǒng)的數(shù)據(jù)流程

          從上面的圖中我們可以看到,數(shù)據(jù)倉(cāng)庫(kù)系統(tǒng)系統(tǒng)數(shù)據(jù)有兩類:業(yè)務(wù)數(shù)據(jù)和多維數(shù)據(jù)。業(yè)務(wù)數(shù)據(jù)由業(yè)務(wù)系統(tǒng)產(chǎn)生,經(jīng)過一系列處理并放到數(shù)據(jù)倉(cāng)庫(kù)中的關(guān)系數(shù)據(jù)庫(kù)。由于它直接來源于業(yè)務(wù)系統(tǒng),因此,它真實(shí)反映了業(yè)務(wù)系統(tǒng)的明細(xì)數(shù)據(jù),由于其數(shù)據(jù)量有可能很大,訪問時(shí)需要考慮要消耗的資源。

          多維數(shù)據(jù)是系統(tǒng)從數(shù)據(jù)倉(cāng)庫(kù)中經(jīng)過匯總、統(tǒng)計(jì)而產(chǎn)生的。它通過采用多維結(jié)構(gòu)和將一些數(shù)據(jù)預(yù)先進(jìn)行了統(tǒng)計(jì)等預(yù)處理操作,對(duì)原始數(shù)據(jù)進(jìn)行重新組合,來實(shí)現(xiàn)靈活而快速的數(shù)據(jù)訪問。

          3.系統(tǒng)開發(fā)框架


          系統(tǒng)架構(gòu)圖

          4.多維分析主題(CUBE)

          存儲(chǔ)用戶所關(guān)心的某一分析主題的相關(guān)數(shù)據(jù),其下包括多個(gè)維(分析角度)和一或多個(gè)指標(biāo)。例如一個(gè)名為Sales的多維分析主題通常會(huì)包括時(shí)間、產(chǎn)品、門店、顧客以及指標(biāo)如銷售額、成本等等。

          (1)、維

          維度是描述事物特征的一個(gè)角度。例如門店銷售情況需要分析商品銷售的時(shí)間、地點(diǎn)、商品名等。這里的時(shí)間、地點(diǎn)、商品名就是門店銷售情況的分析維度。

          (2)維結(jié)構(gòu)

          維度是有結(jié)構(gòu)的,每個(gè)維度可以由若干個(gè)層次組成的,例如時(shí)間維度,可以由四個(gè)層次組成:年、季、月、日,每一個(gè)層次又由若干個(gè)維成員組成。

          (3)、維成員

          組成維度的子成員,如時(shí)間維度可以由其維成員2003年、2004年、2005年等具體年份來構(gòu)成。

          (4)、分析主題

          用戶所關(guān)注業(yè)務(wù)的一個(gè)考核方面:如門點(diǎn)銷售情況分析,倉(cāng)庫(kù)庫(kù)存情況分析等等。

          (5)指標(biāo)

          一個(gè)特殊的維度。它的成員都是數(shù)值型的,用來描述維度或維成員的的量屬性,例如門店銷售情況分析中的銷售額 ,商品成本等。

          (6)、多維分析報(bào)表

          多維分析報(bào)表中的數(shù)據(jù)來源于一個(gè)多維分析主題。多維分析主題能將同一個(gè)分析主題所涉及到的數(shù)據(jù),即影響因素“維”和衡量因素“指標(biāo)”集中存儲(chǔ)并且部分預(yù)先統(tǒng)計(jì)出來,多中角度,對(duì)從原始數(shù)據(jù)中轉(zhuǎn)化出來的、能夠真正為用戶所理解的、并真實(shí)反映企業(yè)特征的信息,進(jìn)行快速、一致、交互地存取,從而獲得對(duì)數(shù)據(jù)的更深入地了解。多維分析報(bào)表的優(yōu)點(diǎn)在于能夠擺脫業(yè)務(wù)系統(tǒng)數(shù)據(jù)及數(shù)據(jù)結(jié)構(gòu)的限制,真正地以客戶的思維邏輯來生成報(bào)表。

          三、        系統(tǒng)開發(fā)

          1 .程序運(yùn)行框架

          本系統(tǒng)主要基于Spring Web MVC框架開發(fā),

          Action配置文件為WEB-INF"springapp-servlet.xml,

          View配置文件為WEB-INF"classes"springapp-views.properties

          程序運(yùn)行框架圖如圖所示:


          程序運(yùn)行框架圖

          2 WCF組件

          本系統(tǒng)對(duì)OLAP的操作主要基于JPivot組件實(shí)現(xiàn),界面展現(xiàn)主要采用WCF組件進(jìn)行渲染,本節(jié)對(duì)JPivot組件和WCF組件的使用進(jìn)行詳細(xì)介紹。

          WCF是一個(gè)JSP 自定制的標(biāo)簽庫(kù),它主要通過XSLT對(duì)XML進(jìn)行渲染,創(chuàng)建、展現(xiàn)和驗(yàn)證HTML表單。特別地,JPivot組件通過Renderable接口中的render方法生成組件的XML描述信息,再借助于WCFRender標(biāo)簽可以將XML描述信息轉(zhuǎn)換為HTML發(fā)布到用戶界面上。以下對(duì)WCF部分標(biāo)簽的用法分別予以介紹。

          (1).form

          此組件采用XML文件的方式來創(chuàng)建HTML表單,該組件在設(shè)計(jì)階段并不中見,必須通過WCF render標(biāo)記進(jìn)行渲染后方可見。XML文件的格式如下:

          示例:

          <xform style="twocolumn">

           <title value="Form Demo">

              <imgButton label="Cancel" .../>

           </title>

           <textField type="int" modelReference="intValue" label="Count" .../>

           <checkBox modelReference="nestedBean.boolValue" label="Check Me" .../>

          </xform>

           

          而它的數(shù)據(jù)綁定而言,關(guān)聯(lián)到了相關(guān)的JavaBean。通過modelReference屬性來對(duì)bean屬性注入值。當(dāng)然modelReference可以包含EL表達(dá)式。

          示例:

          <jsp:useBean id="testbean" class="com.tonbeller.wcf.form.TestBean" scope="session" />

          <wcf:form id="formcomp" xmlUri="/WEB-INF/formdemo.xml" model="#{testbean}"/>

          <form action="formdemo.jsp" method="POST" id="form01">

           <wcf:render ref="#{formcomp}" xslUri="/WEB-INF/wcf/wcf.xsl" xslCache="true"/>

          </form>

          示例:

          <xform style="twocolumn">

           <title value="fmt:fetch.title.from.resource.bundle">

              <imgButton id="cancel" src="wcf/form/cancel.png" action="revert" label="Cancel" forward="tabledemo.jsp" handler="com.tonbeller.wcf.form.ButtonHandler"/>

           </title>

           <!-- Text control -->

           <textField id="string" type="string" modelReference="stringValue" label="Text:"    value="" title="please enter some text"/>

           <textField id="int"    type="int"    modelReference="intValue"    label="Integer:" value="" title="please enter an integer"/>

           <textField id="double" type="double" modelReference="doubleValue" label="Decimal number:"    value="" title="please enter a decimal number"/>

           <textField id="date"   type="date"   modelReference="dateValue"   label="Date:"    value="" title="please enter a date"/>

           <textField id="dateTime" type="dateTime"   modelReference="dateTimeValue"   label="Date/Time:"    value="" title="please enter a date/time"/>

           <!-- Password control -->

           <password id="password" type="string" modelReference="password" label="Password:" value=""/>

           <!-- Text area -->

           <textArea id="textarea" rows="7" cols="40" type="string" modelReference="textArea" label="Text area:" value="This is a text area"/>

           <checkBox id="checkbox1" modelReference="checkBox1" label="check box 1"/>

           <checkBox id="checkbox2" modelReference="checkBox2" label="check box 2"/>

           <!-- ListBox, single selection -->

           <listBox1 id="list1" type="int" modelReference="list1" label="List, single selection:">

              <listItem id="list1.1" value="1" label="list item 1"/>

              <listItem id="list1.2" value="2" label="list item 2"/>

              <listItem id="list1.3" value="3" label="list item 3"/>

              <listItem id="list1.4" value="4" label="list item 4"/>

           </listBox1>

           <!-- ListBox, multiple selection -->

           <listBoxN id="listN" type="int" modelReference="listN" label="List, multiple selection:">

              <listItem id="listN.1" value="1" label="list item 1"/>

              <listItem id="listN.2" value="2" label="list item 2"/>

              <listItem id="listN.3" value="3" label="list item 3"/>

              <listItem id="listN.4" value="4" label="list item 4"/>

           </listBoxN>

           <!-- ListBox, single selection, dynamic item list -->

           <listBox1 id="listbox" type="int" modelReference="dynList" label="List, dynamic content:" handler="com.tonbeller.wcf.form.TestItems"/>

           <label label="This is a label" value="value attribute goes here"/>

           <label label="Dynamic label (content from TextArea)" modelReference="textArea"/>

           <radioButton id="radio1" modelReference="radioButton1" group-id="group1" label="radio button 1"/>

           <radioButton id="radio2" modelReference="radioButton2" group-id="group1" label="radio button 2"/>

           <buttons>

              <button id="cancel" action="revert" label="Cancel" forward="tabledemo.jsp" handler="com.tonbeller.wcf.form.ButtonHandler"/>

              <button id="revert" action="revert" label="Revert" handler="com.tonbeller.wcf.form.ButtonHandler"/>

              <button id="validate" action="validate" label="Validate" handler="com.tonbeller.wcf.form.ButtonHandler"/>

              <button id="ok" action="validate" label="OK" forward="tabledemo.jsp" handler="com.tonbeller.wcf.form.ButtonHandler"/>

           </buttons>

           
          </xform>

          3.JPivot組件

          JPivot - 是一個(gè)JSP 自定制的標(biāo)簽庫(kù),可以繪制一個(gè)OLAP表格和圖表。用戶可以執(zhí)行典型的OLAP操作,如上鉆、下鉆、切片、和切塊等。JPviot組件不能直接產(chǎn)生界面輸出,但Pviot所有的可發(fā)布的組件都實(shí)現(xiàn)了Renderable接口,所有組件的輸出信息都是通過Renderable接口中的render方法生成的,然后由WCF標(biāo)簽庫(kù)的render標(biāo)簽調(diào)用JPivot組件的render方法將組件信息輸出到界面上。以下對(duì)JPivot部分組件的用法分別予以介紹。

          (1).chooseQuery

          采用queryName屬性來創(chuàng)建查詢內(nèi)容。

          示例:

          <jp:mondrianQuery id="query01" queryName="name1">

             SELECT ...

          </jp:mondrianQuery>

          <jp:mondrianQuery id="query01" queryName="name2">

             SELECT ...

          </jp:mondrianQuery>

          ...

          <jp:chooseQuery id="query01" queryName="name1"/>

          (2).clickable

          使所有的維度成員或級(jí)別可以點(diǎn)擊,例如產(chǎn)生一個(gè)鏈接。產(chǎn)生的URL地址包含成員的唯一名稱。當(dāng)然,它的動(dòng)作依賴于sessionParam屬性,當(dāng)它存在時(shí),在新頁面展示之前,參數(shù)值將寫進(jìn)com.tonbeller.jpivot.param.SessionParamPool。當(dāng)不存在時(shí),參數(shù)值將通過編碼附加在超級(jí)鏈接后面。

          示例:

          <jp:mondrianQuery ...>

           select .. from Sales

           <jp:clickable urlPattern="/otherpage.jsp?param={0}" uniqueName="[Customers]"/>

           <jp:clickable page="/yetotherpage.jsp" uniqueName="[Products].[Category]" sessionParam="Category"/>

          </jp:mondrianQuery>

          四、        系統(tǒng)效果

          1. 設(shè)置數(shù)據(jù)源和多維模型


          選擇數(shù)據(jù)源和多維模型

          2. 瀏覽報(bào)表


          打開并瀏覽報(bào)表


          評(píng)論

          # re: 開源BI平臺(tái)Openi的開發(fā)數(shù)據(jù)倉(cāng)庫(kù)系統(tǒng)  回復(fù)  更多評(píng)論   

          2008-01-22 21:50 by afu
          這圖用什么工具畫的?
          主站蜘蛛池模板: 邢台市| 聂拉木县| 高碑店市| 泗阳县| 清徐县| 互助| 琼中| 江津市| 阿克陶县| 永胜县| 金沙县| 马龙县| 贵阳市| 洛扎县| 麟游县| 天等县| 长乐市| 紫金县| 广灵县| 资讯 | 邛崃市| 罗山县| 禹州市| 临清市| 浙江省| 滦南县| 措美县| 茂名市| 泰和县| 藁城市| 黔西县| 兴城市| 营山县| 东宁县| 邵东县| 藁城市| 浑源县| 五河县| 平邑县| 防城港市| 白银市|