使用Mondrian Virtual OLAP Cube 實現星座模型並在saiku展示分析

1.什麼是星座模型?html

2.哪些地方能夠用到星座模型?git

3.Mondrian怎麼構建星座模型,構建過程又涉及到哪些理論概念。github

 

答1:這裏描述了維度模型經常使用的 星型、雪花、星座模型,簡而言之就是多事實表模型。ide

[轉載] 第二篇 數據倉庫與數據集市建模

 

 

答2:例若有個場景,經過資產負債及損益表計算應收款週轉天數。其中資產負債表和損益表都有對應單獨的數據視圖post

計算公式以下:編碼

應收款週轉天數 = 360/(([Total 本期發生數],[營業收入])/(([Total 年初數],[應收帳款])+([Total 期末數],[應收帳款]))/2)

=360/損益表中項目爲[營業收入]的本期發生數合計 /(資產負債表中項目爲[應收帳款]的年初數合計+年底數合計)/2url

=360/損益表中項目爲[營業收入]的本期發生數合計 /(資產負債表中項目爲[應收帳款]的年平均數spa

 

爲了實現上述統計,若是使用傳統物理模型去串表則容易產生數據冗餘的狀況。具體如何冗餘本身腦補一下吧。爲了解決上述問題則經過創建邏輯模型進行計算處理。3d

 

 

答3:code

Mondrian實現理論上的星座模型過程涉及到哪些概念呢?見下圖

1.退化維度的概念參考這裏

維度-退化維度

組織這裏爲何會被稱爲退化維度?由於在資產負債視圖中,已經包含了組織編碼和組織名稱字段,不須要另外串表來實現,因此叫退化維度。基本一個資產負債視圖事實表就替代了N個維度表。

見SQL查詢資產負債視圖

select * from 資產負債視圖

 

 

2.共享維度的概念參考這裏:

維度-共享維度

模型中創建了年度的共享維度,並在資產負債視圖、損益視圖都調用了年度共享維度。

實現方法就是在須要使用共享維度的Cube外面建一個維度,而後在各個Cube須要引用共享維度的使用添加對共享維度的引用。

 爲了模擬方便,手工創建了年度、月度的維度表

 1 create Table 年表   
 2 (
 3 id int,
 4 年度 int
 5 )
 6 
 7 create Table 月表     
 8 (
 9 id int,
10 FYEARID int,
11 月份 int
12 )
13 
14 insert into 年表(id,年度)
15 select 1,2018
16 union all
17 select 2,2019
18 
19 
20 insert into 月表(id,FYEARID,月份)
21 select 1,1,1
22 union all
23 select 2,1,2
24 union all
25 select 3,1,3
26 union all
27 select 4,1,4
28 union all
29 select 5,1,5
30 union all
31 select 6,1,6
32 union all
33 select 7,1,7
34 union all
35 select 8,1,8
36 union all
37 select 9,1,9
38 union all
39 select 10,1,10
40 union all
41 select 11,1,11
42 union all
43 select 12,1,12
44 
45 
46 
47 
48 select * from  年表
49 select * from  月表
50 
51 
52 
53 
54 
55 insert into 月表(id,FYEARID,月份)
56 select 21,2,1
57 union all
58 select 22,2,2
59 union all
60 select 23,2,3
61 union all
62 select 24,2,4
63 union all
64 select 25,2,5
65 union all
66 select 26,2,6
67 union all
68 select 27,2,7
69 union all
70 select 28,2,8
71 union all
72 select 29,2,9
73 union all
74 select 30,2,10
75 union all
76 select 31,2,11
77 union all
78 select 32,2,12
View Code

 

3.重點就是創建虛擬立方體了,

其實這裏虛擬立方體就是星座模型的載體。

Mondrain官方給了虛擬立方體的解釋(Virtual OLAP Cubes) https://help.pentaho.com/Documentation/7.1/0N0/020/040/000

另一個老外那裏給了虛擬立方體的定義案例能夠參考 https://diethardsteiner.github.io/mondrian/2017/03/20/Mondrian-Multivalued-Dimension-Attribute.html

其實前面的準備工做作好了,後面創建虛擬立方體的工做就很簡單了。

首先,命名

而後加入共享維度,注意共享維度不須要填寫 cubeName。

最後是調用資產負債Cube和損益Cube的度量值

例如:調用資產負債Cube的年初數度量值,cubeName選擇資產負債Cube的名稱【BalanceCube】。

而name這裏寫法,[注意]、[注意]、[注意],必須先填寫前綴 [Mesures].  再加上各個Cube的度量值名稱,外面加上中括號[]。

資產負債的年初數度量值寫法應該是

[Mesures].[NCS]

損益的本期發生數寫法則應該是

[Mesures].[BQFSS]

保存,上傳到Saiku,預覽一下模型。

 

 至此,經過Mondrian構建星座模型的工做已成功完成,具體本身調整能夠繼續。

 附上Schema文件

<Schema name="FinSchema" description="&#36130;&#21153;&#27169;&#24335;" measuresCaption="&#36130;&#21153;&#27169;&#24335;">
  <Dimension type="StandardDimension" visible="true" name="&#24180;&#24230;">
    <Hierarchy visible="true" hasAll="true" allMemberName="&#25152;&#26377;&#24180;&#24230;" allMemberCaption="&#25152;&#26377;&#24180;&#24230;" primaryKey="&#24180;&#24230;">
      <Table name="&#24180;&#34920;" schema="dbo" alias="">
      </Table>
      <Level name="&#24180;&#24230;" visible="true" column="&#24180;&#24230;" nameColumn="&#24180;&#24230;" type="Integer" uniqueMembers="false">
      </Level>
    </Hierarchy>
  </Dimension>
  <Cube name="BalanceCube" caption="&#36164;&#20135;&#36127;&#20538;Cube" visible="true" description="&#36164;&#20135;&#36127;&#20538;Cube" cache="true" enabled="true">
    <Table name="&#36164;&#20135;&#36127;&#20538;&#35270;&#22270;" schema="dbo">
    </Table>
    <Dimension type="StandardDimension" visible="true" highCardinality="false" name="&#32452;&#32455;" caption="&#32452;&#32455;&#32534;&#30721;">
      <Hierarchy visible="true" hasAll="true" allMemberName="&#25152;&#26377;&#32452;&#32455;" allMemberCaption="&#25152;&#26377;&#32452;&#32455;">
        <Level name="&#32452;&#32455;&#32534;&#30721;" visible="true" column="&#32452;&#32455;&#32534;&#30721;" nameColumn="&#32452;&#32455;&#21517;&#31216;" type="String" uniqueMembers="false" levelType="Regular" hideMemberIf="Never">
        </Level>
        <Level name="&#32452;&#32455;&#21517;&#31216;" visible="true" column="&#32452;&#32455;&#21517;&#31216;" type="String" uniqueMembers="false" levelType="Regular" hideMemberIf="Never">
        </Level>
      </Hierarchy>
    </Dimension>
    <Dimension type="StandardDimension" visible="true" highCardinality="false" name="&#36134;&#31807;">
      <Hierarchy name="BookHierarchy" visible="true" hasAll="true" allMemberName="&#25152;&#26377;&#36134;&#31807;" allMemberCaption="&#25152;&#26377;&#36134;&#31807;">
        <Level name="&#36134;&#31807;&#21517;&#31216;" visible="true" column="&#36134;&#31807;&#21517;&#31216;" type="String" uniqueMembers="false" levelType="Regular" hideMemberIf="Never">
        </Level>
      </Hierarchy>
    </Dimension>
    <Dimension type="StandardDimension" visible="true" highCardinality="false" name="&#39033;&#30446;&#20998;&#31867;">
      <Hierarchy name="ItemTypeHierarchy" visible="true" hasAll="true" allMemberName="&#25152;&#26377;&#20998;&#31867;" allMemberCaption="&#25152;&#26377;&#20998;&#31867;">
        <Level name="&#39033;&#30446;&#20998;&#31867;" visible="true" column="&#39033;&#30446;&#20998;&#31867;" type="String" uniqueMembers="false" levelType="Regular" hideMemberIf="Never">
        </Level>
      </Hierarchy>
    </Dimension>
    <Dimension type="StandardDimension" visible="true" highCardinality="false" name="&#39033;&#30446;&#21517;&#31216;">
      <Hierarchy name="ItemHierarchy" visible="true" hasAll="true" allMemberName="&#25152;&#26377;&#39033;&#30446;" allMemberCaption="&#25152;&#26377;&#39033;&#30446;">
        <Level name="&#39033;&#30446;&#21517;&#31216;" visible="true" column="&#39033;&#30446;&#21517;&#31216;" type="String" uniqueMembers="false" levelType="Regular" hideMemberIf="Never">
        </Level>
      </Hierarchy>
    </Dimension>
    <DimensionUsage source="&#24180;&#24230;" name="&#24180;&#24230;" visible="true" foreignKey="&#24180;">
    </DimensionUsage>
    <Measure name="NCS" column="&#24180;&#21021;&#25968;" aggregator="sum" visible="true">
    </Measure>
    <Measure name="QMS" column="&#26399;&#26411;&#25968;" aggregator="sum" visible="true">
    </Measure>
  </Cube>
  <Cube name="ProfitCube" caption="&#21033;&#28070;Cube" visible="true" description="&#21033;&#28070;Cube" cache="true" enabled="true">
    <Table name="&#25439;&#30410;&#35270;&#22270;" schema="dbo">
    </Table>
    <Dimension type="StandardDimension" visible="true" highCardinality="false" name="&#32452;&#32455;">
      <Hierarchy visible="true" hasAll="true" allMemberName="&#25152;&#26377;&#32452;&#32455;" allMemberCaption="&#25152;&#26377;&#32452;&#32455;">
        <Level name="&#32452;&#32455;&#32534;&#30721;" visible="true" column="&#32452;&#32455;&#32534;&#30721;" nameColumn="&#32452;&#32455;&#32534;&#30721;" type="String" uniqueMembers="false" levelType="Regular" hideMemberIf="Never">
        </Level>
        <Level name="&#32452;&#32455;&#21517;&#31216;" visible="true" column="&#32452;&#32455;&#21517;&#31216;" type="String" uniqueMembers="false" levelType="Regular" hideMemberIf="Never">
        </Level>
      </Hierarchy>
    </Dimension>
    <Dimension type="StandardDimension" visible="true" highCardinality="false" name="&#36134;&#31807;">
      <Hierarchy visible="true" hasAll="true" allMemberName="&#25152;&#26377;&#36134;&#31807;" allMemberCaption="&#25152;&#26377;&#36134;&#31807;">
        <Level name="&#36134;&#31807;&#21517;&#31216;" visible="true" column="&#36134;&#31807;&#21517;&#31216;" type="String" uniqueMembers="false" levelType="Regular" hideMemberIf="Never">
        </Level>
      </Hierarchy>
    </Dimension>
    <Dimension type="StandardDimension" visible="true" highCardinality="false" name="&#39033;&#30446;&#21517;&#31216;">
      <Hierarchy visible="true" hasAll="true" allMemberName="&#25152;&#26377;&#39033;&#30446;&#21517;&#31216;" allMemberCaption="&#25152;&#26377;&#39033;&#30446;&#21517;&#31216;">
        <Level name="&#39033;&#30446;&#21517;&#31216;" visible="true" column="&#39033;&#30446;&#21517;&#31216;" type="String" uniqueMembers="false" levelType="Regular" hideMemberIf="Never">
        </Level>
      </Hierarchy>
    </Dimension>
    <DimensionUsage source="&#24180;&#24230;" name="&#24180;&#24230;" visible="true" foreignKey="&#24180;">
    </DimensionUsage>
    <Measure name="BQFSS" column="&#26412;&#26399;&#21457;&#29983;&#25968;" datatype="Numeric" aggregator="sum" visible="true">
    </Measure>
  </Cube>
  <VirtualCube enabled="true" name="BPCube" description="&#36130;&#21153;&#36164;&#20135;&#36127;&#20538;&#25439;&#30410;&#27169;&#22411;">
    <VirtualCubeDimension name="&#24180;&#24230;">
    </VirtualCubeDimension>
    <VirtualCubeMeasure cubeName="BalanceCube" name="[Measures].[NCS]" visible="true">
    </VirtualCubeMeasure>
    <VirtualCubeMeasure cubeName="ProfitCube" name="[Measures].[BQFSS]" visible="true">
    </VirtualCubeMeasure>
  </VirtualCube>
</Schema>
View Code
 
其實度量值能夠用中文標示

相關文章
相關標籤/搜索