日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

      歡迎訪問 生活随笔!

      生活随笔

      當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

      综合教程

      Mondrian开源OLAP引擎详解

      發布時間:2023/12/31 综合教程 33 生活家
      生活随笔 收集整理的這篇文章主要介紹了 Mondrian开源OLAP引擎详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

      Mondrian是一個基于Java語言的開源OLAP引擎,它通過MDX語句執行查詢,從關系型數據庫RDBMS中讀取數據,然后經過Java API以多維度的形式展示查詢結果。Mondrian是一個OpenSource的基于關系數據庫的分析服務器,遵循MDX、XML/A和JOLAP標準。

      Mondrian的架構

      Mondrian從架構上可以分為四個層次:表現層、計算層、聚合層、存儲層。

      表現層:指最終呈現在用戶顯示器上的以及與用戶之間的交互,有許多方法來展現多維數據,包括數據透視表、餅、柱、線狀圖。編寫jsp文件用于展示它位于展示層由Jpivot提供展示。JPivot 是Mondrian的表現層TagLib,Jpivot完全基于JSP+TagLib;JPivot另外一個可能使人不慣的地方是它完全基于taglib而不是大家熟悉的MVC模式。但它可以很方便的將多維數據展示給最終用戶。計算層:分析、驗證、執行MDX語句, 先計算坐標軸,然后再計算每個單元格的值,從效率上的考慮,計算層批量從聚合層獲取單元格數據集合。聚合層:聚合層中緩存了多維查詢結果,即單元格的數據集合,如果計算層所需要的數據不在緩存中,從存儲層中進行查詢獲取數據并緩存。schema文件(關鍵部分)將存儲層的數據倉庫轉化為一個schema文件,通過schema-workbench或者手寫完成,至此就可以通過MDX來對多維數據庫進行訪問。存儲層:采用關系數據庫實現,一般采用星型模型構建,提供維表、事實表和聚合表。

      系統部署結構上,可以分三層結構分開部署,將表現層部署在一臺機器上,計算層和聚合層部署在第二臺,存儲層部署在第三臺。

      上圖為整體的項目架構,圖中所示Mondrian分成了四個大部分Schema manager、Session Manager、Dimension Manager、Aggregate Manager,而實際上各個部分有著更為緊密的聯系。對于Dimensional Layer、Star Layer和SQL Layer的劃分,更多是處于總體邏輯分層的考慮,具體在源碼中,邏輯分層的概念比較模糊。

      下面是四個Manager的簡介:

      Session Manager:最為重要的一個部分。接受MDX查詢、解析MDX,返回結果。Schema Manager:與初始化緊密相關。主要是一些重要的數據結構如緩存池的構建以及多維模型的生成。Aggregate Manager:實現了對聚集表的管理。主要是對OLAP緩存的管理,屬于性能優化的部分。Dimension Manager:維度的管理。實現多維模型中維度和關系數據庫表中列的映射,在Schema Manager也有部分功能處理這些映射。

      存儲、聚合

      根據OLAP服務器數據存儲技術,可以分為ROLAP和MOLAP,Mondrian采用ROLAP技術。在ROLAP的多維模型組織和存儲數據中,比較常用的方式是星型模式,由一個事實表和一組維度表組成。維度必須預先確定,可以是一般的星型架構,也可以是比較特殊的父子架構、雪花架構等。在ORACLE數據庫中,我們能夠按照維度進行預先的統計、分類、排序,創建大量的實體化視圖。對于沒有實體化視圖類似功能的數據庫,我們也可以創建大量的臨時聚合表,這樣當用戶進行比較高級的分析的時候,不用訪問數據量龐大的基礎事實表,只需要在我們已經形成的實體化視圖或聚合表上作進一步的聚合就可以了,這樣能夠大大提高查詢分析的效率,并且減少占用的系統資源。

      在使用聚合表方面有一個關鍵的技術稱之為”聚合感知”技術,只有OLAP引擎必須能夠根據多維查詢中的維度信息,從適當的聚合表中提取數據,否則聚合表形同虛設。另外在多維模型設計中,設計正確的聚合表也是很關鍵的。不恰當的設計導致將聚合表的不能滿足多維查詢的需求,每次從事實表取數據,開銷是非常大的。Mondrian采用關系數據庫存儲事實表,其本身不具有”聚合感知”的技術,當需要從比較明細的事實表中匯總數據時,性能就比較差了。但是如果關系數據庫能夠支持實體化視圖或其他聚合技術,那么就可以利用關系數據庫的技術透明的提高系統性能。可以利用Oracle實體化視圖來提高Mondrian的效率。

      下圖描述了一個數據庫的結構。該數據庫中共有五張表,分別是Sales表,Customer表,Time表,Product表和Mfr表。這個數據庫的作用是存儲每一筆交易:包括這筆交易發生在什么時間,交易的產品類型,進行交易的客戶信息,交易方式,交易了多少件產品以及成交金額是多少。

      星型模型中有一張事實表(Sales),兩個度量列(units和dollars),四個維度表(Product, Mfr, Customer, Time)。在這個星型模型的最頂層,我們創建了以下多維模型:

      [Sales]立方體包含[Unit sales]和[Dollar sales]兩個度量值;[Product]維度包含[All Products],[Manufacturer],[Brand],[Prodid]四個級別;[Time]維度包含[All Time],[Year],[Quarter],[Month],[Day]五個級別;[Customer]維度包含[All Customers],[State],[City],[Custid]四個級別;[Payment Method]維度包含[All Payment Methods],[Payment Method]兩個級別。

      其中,大部分維度都有一個對應的維度表,除了兩個地方:[Product]維度是一個雪花維度,它會把Product和Mfr兩張表展開;[Payment Method]維度是一個退化的維度,直接使用事實表中的payment列作為維度屬性,因此不需要一個單獨的維表。

      假設現在我們要對交易做一些統計,例如,某一件特定產品在某一個時間段內以某種特定方式總共賣出多少件或多少錢,這時成交產品數和成交金額是我們最終關注的內容,其他的因素例如時間、產品、方式等都只是對我們最終關注內容進行統計的限制條件。

      在上面的例子中,限制條件有時間、產品類型、用戶類型和交易方式,有時我們并不需要同時使用所有的限制條件,例如,當我們只想知道指定產品的成交總金額時,那么除了產品類型之外其他三個限制條件都是多余的,而在查詢時,需要在整個事實表中執行查詢,找出產品類型為指定類型的所有產品然后再做統計,為了提高查詢效率,我們可以新建一張表,這張表按照產品類型把事實表中的行合并到一起,合并的方式是拋棄其他維,把度量值按特定的方式(max,min,sum,count或avg)整合到一起。這種表被叫做聚合表(Aggregate Table)。

      Mondrian緩存控制

      為了提高海量數據下的查詢響應速度,Mondrian自動將首次查詢的結果緩存到內存中,之后的查詢如果命中緩存內容,則不再訪問數據庫。這種實現方式有點自不必說,但是在實現實時OLAP時會存在問題,實時OLAP中數據變化頻繁導致緩存中的數據不是最新的。

      緩存控制接口:為了做到不重啟OLAP Server也能更新緩存,Mondrian提供了一系列的刷新緩存的接口,支持指定清除指定schema的元數據緩存、查詢結果緩存;清除動作可以是全部清除 也可以是 部分清除(可以指定清除某個維度下某級別成員的相關內容)。數據變化監聽: Mondrian提供了緩存控制接口(被動響應),但對于實現我們的目標“實時OLAP”來說我們就需要自己實現一個數據變更監聽的模塊,來監聽數據變化,一旦數據有變化就發起變更事件,更新Mondrian引擎的緩存。

      目前初步考慮實現方案為ETL工具在數據處理結束后通知OLAP引擎。引擎收到數據變更通知后做清理緩存的動作。

      Mondrian Scheme詳解

      Mondrian通過Schema來定義一個多維數據庫,它是一個邏輯概念上的模型,其中包含Cube(立方體)、Dimension(維度)、Hierarchy(層次)、Level(級別)、Measure(度量),這些被映射到數據庫物理模型。Mondrian中Schema是以XML文件的形式定義的。

      Cube(立方體)是一系列Dimension和Measure的集合區域,它們共用一個事實表。Dimension(維度)是一個Hierarchy的集合,維度一般有其相對應的維度表,它由Hierarchy(層次)組成,而Hierarchy(層次)又是由組成Level(級別)的。Hierarchy(層次)是指定維度的層級關系的,如果沒有指定,默認Hierarchy里面裝的是來自立方體中的真實表。Level(級別)是Hierarchy的組成部分,使用它可以構成一個結構樹,Level的先后順序決定了Level在結構樹上的位置,最頂層的 Level 位于樹的第一級,依次類推。Measure(度量)是我們要進行度量計算的數值,支持的操作有sum、count、avg、distinct-count、max、min等。

      Schema

      Schema 定義了一個多維數據庫。包含了一個邏輯模型,而這個邏輯模型的目的是為了書寫 MDX 語言的查詢語句。這個邏輯模型實際上提供了這幾個概念:

      Cubes: 立方體Dimensions: 維度Hierarchies: 層次Levels: 級別Members: 成員

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

      Cube

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

      name: Cube 的名字。caption: 標題 , 在表示層顯示的。cache: 是否對 Cube 對應的實表用 mondrian 進行存儲 , 默認為 true。enabled: 是布爾型的 , 如果是被激活 ,Cubes 就執行 , 否則就不予理睬,默認為 true。Cube 里面有一個全局的標簽定義了所用的事實表的表名。

      Dimension

      他是一個層次( Hierarchies )的集合 , 維度一般有其相對應的維度表 . 他的組成是由層次(Hierarchies)而層次(Hierarchies)又是有級別(Level)組成 . 其屬性如下:

      name: Dimension 的名稱。type: 類型,有兩個可選的類型: StandarDimension 和 TimeDimension ,默認為StandardDimension。caption: 標題 , 在表示層顯示的UsagePrefix加前綴 , 消除歧義。foreignKey: 外鍵,對應事實表中的一個列,它通過 <Hierarchy> 元素中的主鍵屬性連接起來。

      Hierarchy

      你一定要指定其中的各種關系,如果沒有指定,就默認 Hierarchy 里面裝的是來自立方體中的真實表 . 屬性如下:

      name: Hierarchy 的名稱,該值可以為空,為空時表示 Hirearchy 的名字和 Dimension 的名字相同。當一個 Dimension 有多個 Hierarchy時,注意 name 值要唯一。hasAll: 布爾型的 , 決定是否包含全部的成員 member。allMemberName: 所有成員的名字 , 也就是總的標題 , 例如: allMemberName= “全部產品”。allLevelName: 所有級別的名字,它會覆蓋其下所有的 Member 的 name 和所有的 Level 的 name 屬性的值。allMemberCaption: 例如 : allMemberCaption= “全部產品”這個是在表示層顯示的內容。PrimaryKey: 通過主鍵來確定成員,該主鍵指的是成員表中的主鍵,該主鍵同時要與 Dimension 里設置的 foreignKey 屬性對應的字段形成外鍵對應關系。primaryKeyTable: 如果成員表不只一個,而是多個表通過 join 關系形成的,那么就要通過這個屬性來指明 join 的這些表中,哪一個與Dimension 里設置的foreignKey 屬性形成外鍵關系。通過該屬性來指明主表。caption: 標題 , 在表示層顯示的。defaultMembermemberReaderClass 設定一個成員讀取器,默認情況下 Hierarchy 都是從關系型數據庫里讀取的,如果你的數據不在 RDBMS 里面的話,你可以通過自定義一個member reader 來表現一個 Hierarchy 。

      Level

      級別 , 他是組成 Hierarchy 的部分。屬性很多,并且是 schema 編寫的關鍵,使用它可以構成一個結構樹, Level 的先后順序決定了 Level在這棵樹上的的位置,最頂層的 Level 位于樹的第一級,依次類推。 Level 的屬性如下:

      name: 名稱table: 該 Level 要使用的表名column: 用上面指定的表中某一列作為該 Level 的關鍵字nameColumn: 用來顯示的時候使用,如果不定義,那么就采用上面的 column 的值來進行顯示。oridinalColumn: 定義該 Level 上的成員的顯示順序,如果不指定,那么采用 column 的值。parentColumn: 在一個有父 – 子關系的 Hierarchy 當中,當前 Level 引用的是其父成員的列名。好比是一張部門表,在一張表里表現部門的上下級關系,一個是主鍵,肯定還有一個字段為連接到該主鍵的外鍵的列名,這里的 parentColumn 指的就是這個列名。nullParentValue: 如果當前的 Level 是有上下級關系(設置了 parentColumn 屬性),如果該 Level 又處于頂級,我們需要將頂級的數據取出來,這里指的是位于頂級的父成員的值,有些數據庫不支持 null, 那么也可以使用0或-1 等,這就表示頂級的成員的父 ID 為0 或為-1 。type: 數據類型,默認值為 string 。當然還可以是 Numeric 、 Integer 、 Boolean 、 Date 等。uniqueMembers: 該屬性用于優化產生的 SQL ,如果你知道這個級別和其父級別交叉后的值或者是維度表中給定的級別所有的值是唯一的,那么就可以設置該值為 true ,否則為 false 。levelType: 該 Level 的類型,默認為 regular (正常的),如果你在其 Dimension 屬性 type 里選擇了 TimeDimension 那么這里就可以選擇 TimeYears 、 TimeQuarters 、 TimeMonth 、 TimeWeeds 、 TimeDays 。hideMemberIf: 在什么時候不隱藏該成員,可選的值有三個: Never 、 IfBlankName 、 IfParentNameapproxRowCount: 該屬性可以用來提高性能,可以通過指定一個數值以減少判斷級別、層次、維度基數的時間,該屬性在通過使用 XMLA 連接Mondrian 很有用處。caption: 標題 , 在表示層顯示的。captionColumn: 用來顯示標題的列。formatter: 該屬性定義了 Member.getCaption() 方法返回的動作值,這里需要是一個實現了 mondrian.olap.MemberFormatter 接口的類,用來對Caption地值進行格式化。

      Join

      對于一個 Hierarchy 來說,有兩種方式為其指定:一種是直接通過一個 Table 標簽指定;一種是通過 Join 將若干張表連接起來指定。一旦采用 Join 的話,那么就要在 Hierarchy 里的 primaryKeyTable 屬性指定主表。

      Measure

      Measure 就是我們要計算的數值,操作的核心。它的屬性如下:

      name: 名稱。aggregator: 要采用的計算函數。column: 要計算的列名。formatString: 計算結果的顯示格式。visible: 是否可見。datatype: 數據類型,默認為 Numericformatter: 采用類來對該 Measure 的值進行格式,具體參考 Level 的 formatter 屬性。caption: 標題,用來顯示時使用。

      概括總結一下:在多維分析中,關注的內容通常被稱為度量(Measure),而把限制條件稱為維度(Dimension)。多維分析就是對同時滿足多種限制條件的所有度量值做匯總統計。包含度量值的表被稱為事實表(Fact Table),描述維度具體信息的表被稱為維表(Dimension Table),同時有一點需要注意:并不是所有的維度都要有維表,對于取值簡單的維度,可以直接使用事實表中的一列作為維度展示。

      參考鏈接:

      http://mondrian.pentaho.org/http://sourceforge.net/projects/mondrian/

      正因為當初對未來做了太多的憧憬,所以對現在的自己尤其失望。生命中曾經有過的所有燦爛,終究都需要用寂寞來償還。

      總結

      以上是生活随笔為你收集整理的Mondrian开源OLAP引擎详解的全部內容,希望文章能夠幫你解決所遇到的問題。

      如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。