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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Mondrian

發布時間:2024/3/26 编程问答 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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。并且認為讀者已經針對jdk和Tomcat做了正確的開發環境的設置。
2.1準備工作

將pentaho/mondrian/lib下的mondrian.war解壓后放到%Tomcat%/webapp/下面

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)?????????? --薪酬
);
?

當然,為了使系統能夠運行,還需要讀者向數據庫表中插入一些數據。

insert into tb_employee(employee_id,employee_name)values(001,'婭婭');
insert into tb_time(time_id,the_year,the_month)values(1,'2011','05');
insert into tb_salary(employee_id,time_id,salary)values(001,'1','5000');

insert into tb_employee(employee_id,employee_name)values(002,'梅梅');
insert into tb_time(time_id,the_year,the_month)values(2,'2011','04');
insert into tb_salary(employee_id,time_id,salary)values(002,'2','10000');

insert into tb_employee(employee_id,employee_name)values(002,'芳芳');
insert into tb_time(time_id,the_year,the_month)values(3,'2011','04');
insert into tb_salary(employee_id,time_id,salary)values(003,'3','10000');
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/test.xml
2.4利用MDX查詢?? mywebapp/test.jsp
<%@ page import="mondrian.olap.*"%>
<%@ page import="java.io.PrintWriter" %>
<%
?Connection connection = DriverManager.getConnection("Provider=mondrian;Jdbc=jdbc:oracle:thin:hibuser/password@localhost:1521:orcl;? Catalog=file:///F:/pentaho/biserver-ce/tomcat/webapps/mondrian/WEB-INF/queries/test1.xml; JdbcDrivers=oracle.jdbc.driver.OracleDriver;",null);????
?String queryStr="select {[Measures].[Salary]} ON COLUMNS,{[Employee].[employeeId].Members} ON ROWS from CubeTest ";
?
?Query query =connection.parseQuery(queryStr);
?Result result = connection.execute(query);
PrintWriter pw = new PrintWriter(System.out);
result.print(pw);
pw.flush();
System.out.println("successful!");
%>

?

2.5運行

這時啟動tomcat,在瀏覽器地址欄中輸入
http://localhost:8080/mondrian/test.jsp即可。
三、深入探討

3.1 API

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

和JDBC一樣,也是要經過建立連接,形成查詢語句,執行查詢得到結果集等幾個步驟的。

我們來看看mondriantest.jsp的代碼
第1行:import mondrian.olap.*
這是引入我們所需的類,下面要用到的DriverManager、Connection、Query、Result都在這個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類似于JDBC的Statement,而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作為基于java的OLAP引擎,而且是開源的項目,為那些基于java的項目而要脫離微軟構架但又不得不對大量數據進行分析的項目又提供了一種可行的方案。希望它也能象蒙得里安·皮特對抽象藝術的發展產生影響一樣起到一定的作用。


總結

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

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

主站蜘蛛池模板: 国产精品一区二区无码对白 | 国产亚洲精品久久久久久久久动漫 | 玖玖爱这里只有精品 | 精品黑人一区二区三区久久 | 狠狠搞av | 色婷婷基地 | 一区二区三区免费在线视频 | 91夜色视频 | 抖音视频在线观看 | 国产又黄又猛又爽 | 欧美在线精品一区 | 东北少妇av | 免费观看一区二区三区视频 | 日韩和的一区二区 | 超碰97成人| a级黄色网址 | 亚洲天堂网在线观看视频 | 操模特| 日本手机看片 | 亚洲免费视频播放 | 国产精品国产a级 | 亚洲字幕在线观看 | 色人阁五月 | av无码精品一区二区三区宅噜噜 | 欧美36p| 偷拍一区二区三区四区 | 日本欧美另类 | 成年人在线网站 | 美女日批网站 | 69成人网 | 老色批av | 国产肥熟 | 台湾综合色 | 涩色视频 | 婷婷四房综合激情五月 | www.免费av | caopeng视频 | 国产丰满农村老妇女乱 | 超碰在线免费公开 | 豆花在线视频 | 亚洲综合在线播放 | 久久国内视频 | 国产精品无码久久久久久 | 国产精品成人一区二区网站软件 | 欧美精品一二三四区 | 国产传媒一区二区三区 | 日美毛片| 日本免费黄色 | 亚洲高清视频在线播放 | 超碰97在线播放 | 阿娇全套94张未删图久久 | 四虎av影视| 麻豆久久久久久久 | 国产精品美女一区二区三区 | 日韩一级片在线观看 | 欧美精品久久久久久久久 | 91精品免费在线观看 | 亚洲午夜久久久久久久久 | 打开免费观看视频在线播放 | jizz亚洲女人高潮大叫 | 精品一区二区三区免费视频 | 亚洲第一激情 | 天天操好逼 | 亚洲图片欧美在线 | 国产性一乱一性一伧一色 | 亚洲天堂伊人网 | 五月激情丁香婷婷 | 午夜黄色| 亚洲天天av | 天天干天天插 | 色亭亭 | 日韩天天操 | 好男人香蕉影院 | 97香蕉久久夜色精品国产 | 国产永久精品大片wwwapp | av在线影视| 狠狠操狠狠插 | 丝袜理论片在线观看 | 后进极品美女白嫩翘臀 | 日韩视频a| 女儿的朋友在线播放 | 精品国模| 8090理论片午夜理伦片 | 人与动物av | 免费观看成年人网站 | 夜夜草网站 | 免费精品久久 | 国产精品99久久久久久久女警 | 自拍亚洲综合 | 午夜时刻免费入口 | h片在线看 | 在线a网站| 久久久久色 | 国产视频在线观看一区二区 | 午夜视频免费 | 毛片网站免费 | 欧美四级在线观看 | 熟妇高潮一区二区三区 | 性欧美最猛 |