mondrian的个人总结
1. OLAP的作用和功能
OLAP(On-Line Analysis Processing)在線分析處理是一種共享多維信息的快速分析技術;OLAP利用多維數據庫技術使用戶從不同角度觀察數據,它用于支持復雜的分析操作,側重于對管理人員的決策支持,可以滿足分析人員快速、靈活地進行大數據復量的復雜查詢的要求,并且以一種直觀、易懂的形式呈現查詢結果,輔助決策。
OLAP用了多維分析的技術。盡管關系型數據庫所存儲的所有數據都是以行和列的形式存在的,但一個多維數據庫還是可以看做一個由軸(axes)和單元(cell)所組成的立方。借助這個立方,OLAP可以完成鉆取、切片、切塊、旋轉等操作。所謂的鉆取操作就是改變維的層次,變化分析的粒度。Drill-up是將低層次的數據概括到高層次的匯總數據或者說是減少維度;Drill-up則是相反,是將匯總的數據深入到細節,或說是增加新維。切片和切面操作是在一部分維上選定值后,關心度量數據在剩余維上的分布。如果剩余的維只有兩個,則是切片;如果有三個或以上,則是切塊。旋轉操作即是變換維的方向,即在表格中重新安排維的放(例如行列互換)。
那么這個立方是以什么形式存儲在關系數據庫中的呢?它通常對應一個星型模型或者雪花模型。所謂的星型模型,它是由若干個事實表和若干個維表組成,事實表包括所有分析維度的外鍵和一個度量,維表對應于各個分析的角度,它除了主鍵以外還包含描述和分類信息。雪花模型是對星型模型的擴展。它對星型模型的維表進一步層次化,原有的各維表可能被擴展為小的事實表,形成一些局部的“層次”區域,這些被分解的表都連接到主維度表而不是事實表。
2. Mondrian的選型依據
Mondrian是一個OLAP的服務引擎,而且是一個ROLAP引擎。它本身不管理數據的儲存,這是由關系數據庫來做的,它使用JDBC讀取數據,因此,不管數據存儲于普通關系數據庫,或是數據集市、數據倉庫,只要能用JDBC訪問就可以。
Mondrian主要功能就是對數據量極大的數據表和相關聯的多個維度表進行查詢、匯總、軸變換以及上卷、下鉆等操作,查詢可以非常復雜,如果沒有Mondrian引擎這是很難完成的。
Mondrian完成多維度的查詢、匯總等相關操作是通過書寫相應的MDX語句來完成的。MDX是多維數據庫的查詢語言,這已成為一個標準,就跟SQL是關系數據庫的查詢語言類似。然后,Mondrian會解析MDX語句,轉化成SQL來查詢關系數據庫,這個查詢可能是多條的。本質是mondrian就是一個解釋器,將MDX語句解釋為SQL語句來完成相關查詢。
Mondrian的相關測試:
當數據量為1億時,刷新立方所需花費的時間為33052.0毫秒。所謂的刷新是立方操作就是后臺數據庫中對表進行了相關增刪改查操作,程序調用了刷新立方函數的過程。它會清除Mondrian緩存,重新刷新schem文件。此外,當數據量為一億時,初次查詢和刷新立方操作所產生的資源消耗數據如下:1.服務器CUP:占用比率大概150%;2.服務器端mysql 內存占用不是很大 3%;3.測試端程序(即客戶端)占用內存大概61296K。其他mondrian相關的測試結果如下圖所示。
3. Mondrian的整體架構
(1)表現層(thepresentation layer)
Jpivot表現層或者通過Java API進行查詢結果的展示。
(2)維度層(thedimensional layer)
維度層用來解析、驗證和執行MDX查詢要求。一個MDX查詢要通過幾個階段來完成:首先是計算坐標軸(axes),再者計算坐標軸axes中cell的值。
?為了提高效率,維度層把要求查詢的單元成批發送到集合層,查詢轉換器接受操作現有查詢的請求,而不是對每個請求都建立一個MDX 聲明。
(3)集合層(the starlayer)
集合層負責維護和創建集合緩存,一個集合是在內存中緩存一組單元值,這些單元值由一組維的值來確定。
維度層對這些單元發出查詢請求,如果所查詢的單元值不在緩存中,則集合管理器(aggregation manager)會向存儲層發出查詢請求。
(4)存儲層(the storagelayer)
存儲層是一個關系型數據庫(RDBMS)。它負責創建集合的單元數據,和提供維表的成員。
Mondrian系統由四個層組成,從最終用戶到數據中心,順序為: 表現層(the presentation layer)、維度層(the dimensional layer)、集合層(the star layer)和存儲層(the storage layer)。
4. 定義報文的JSON格式:
{"consumption":"nts_sample","region": [{"province":"江蘇","city":"南京","district":"玄武","building":"1號建筑","area":"1號區域"},{"province":"湖南","city": "長沙","district":"雨花","building":"1號建筑","area":"1號區域"}],"time": [{"year":"2015","quater":"1","month":"1","day":"2","hour":"0","minute":"0"},{"year":"2015","quater":"2","month":"5","day":"2","hour":"0","minute":"0"}],"category": [{"categorytype": "動力"},{"categorytype": "照明"}],"org": [{"group":"天溯","company":"研發中心","branch":"系統軟件部","department":"企業組"},{"group":"天溯","company":"研發中心","branch":"產品部","department": "UCD"}]}其中consumption表示能源的消耗值,value對應于事實表中的度量字段的取值;region對應于地區維度,它是一個一維數組,查詢的地區可以是零到多個,地區下面存在省、市、地區、樓宇、區域這5個層次(level);time對應于時間維度,查詢的時間可以是零到多個,也是一個一維數組,時間下面存在年、季度、月、日、時、分等層次;因為class是java的關鍵字,所以用category來表示設備的一維數組,查詢的設備可以是零到多個,它下面存在設備類型這一層次;org表示單位的一維數組,查詢的單位可以是零到多個,org下面存在組織、公司、部門、職位這幾個層次。
5.? 具體調用的方法
首先是解析報文的函數,此處采用了java的開源框架fastjson,fastjson是效率最高的json解析器和生成器,通過它可以方便的完成json與java對象之間的相互轉換。
/*** 解析報文函數** @paramString jsonStr* 接受的報文格式* @returnEway* 對數據倉庫封裝的一層數據結構*/publicstatic Eway parseJson(StringjsonStr) {//反序列化操作Ewayeway = JSON.parseObject(jsonStr, Eway.class);//將接受的報文值存入封裝好的數據結構之中eway.setComsumption(eway.getComsumption());eway.setRegion(eway.getRegion());eway.setTime(eway.getTime());return eway;}QueryExcute函數是對MDX查詢語句的簡單封裝,用戶無需關心細節的MDX語句,只需傳入待查詢的參數,后臺程序以拼接字符串的形式,完成相關MDX語句的生成。
?
/*** 多維數據庫的查詢函數* @param measures* 度量* @param axis0* 維度1* @param axis1* 維度2* @return* MDX執行語句*/public static StringQueryExcute(String measures, String axis0, String axis1) {String Query ="select {[Measures].[" + measures + "]} ONCOLUMNS,{[region.default].[" + axis0 + "]} ON ROWS from [ntsdw] where[time.default].[" + axis1 + "]";return Query;}?? PrintResult函數是完成的MDX查詢,并打印輸出結果集。它與JDBC類似。首先是通過Mondrian.OLAP包下的Connection對象獲取連接,連接必須指明引擎的名稱,連接數據庫的名稱及用戶名和密碼,對應的邏輯模型;然后調用connection的parseQuery方法來解析查詢語句;最后將查詢的結果保存到一個result對象之中,以流的形式在控制臺打印輸出。
/*** 打印輸出 多維數據庫查詢結果的函數* 1.獲取連接;* 2.執行查詢語句;* 3.將查詢的結果保存到result之中;* 4.打印輸出。*/@SuppressWarnings("deprecation")public static voidPrintResult(){Connection connection =DriverManager.getConnection("Provider=mondrian;Jdbc=jdbc:mysql://192.168.20.230/nts_eway_ee?user=root&password=iamnts;Catalog=E:/ntsdw.xml;",null);String jsonStr ="{\"comsumption\":\"nts_sample\",\"region\":[{\"province\": \"江蘇\"}],\"time\":[{\"year\": \"2015\"}]}";Ewayeway=parseJson(jsonStr); Stringmeasures=eway.getComsumption();Stringaxis0=eway.getRegion().get(0).getProvince();Stringaxis1=eway.getTime().get(0).getYear();Query query =connection.parseQuery(QueryExcute(measures,axis0,axis1));Result result =connection.execute(query);PrintWriter pw = newPrintWriter(System.out);result.print(pw);pw.flush();}總結
以上是生活随笔為你收集整理的mondrian的个人总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2021 owasp top10
- 下一篇: 课表查询系统java数据库_教务管理系统