zoukankan      html  css  js  c++  java
  • 使用Mondrian Virtual OLAP Cube 实现星座模型并在saiku展现分析

    1.什么是星座模型?

    2.哪些地方可以用到星座模型?

    3.Mondrian怎么构建星座模型,构建过程又涉及到哪些理论概念。

    答1:这里描述了维度模型常用的 星型、雪花、星座模型,简而言之就是多事实表模型。

    [转载] 第二篇 数据仓库与数据集市建模

    答2:例如有个场景,通过资产负债及损益表计算应收款周转天数。其中资产负债表和损益表都有对应单独的数据视图

    计算公式如下:

    应收款周转天数 = 360/(([Total 本期发生数],[营业收入])/(([Total 年初数],[应收账款])+([Total 期末数],[应收账款]))/2)

    =360/损益表中项目为[营业收入]的本期发生数合计 /(资产负债表中项目为[应收账款]的年初数合计+年末数合计)/2

    =360/损益表中项目为[营业收入]的本期发生数合计 /(资产负债表中项目为[应收账款]的年平均数

    为了实现上述统计,如果使用传统物理模型去串表则容易产生数据冗余的情况。具体如何冗余自己脑补一下吧。为了解决上述问题则通过建立逻辑模型进行计算处理。

    答3:

    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
     
    其实度量值可以用中文标示

  • 相关阅读:
    微信5.0绑定银行卡教程
    从陈坤微信号说起:微信公众平台开发者的江湖
    微信商业化解读
    微信公众平台开发(63)汽车查询
    微信公众平台开发(64)航班动态
    张小龙的微信帝国诞生记
    微信公众平台开发(65) 微博树洞
    微信公众平台开发(66)人品计算
    扫奖网-免费抽奖信息聚集平台
    微信公众平台开发(67)百度百科
  • 原文地址:https://www.cnblogs.com/Bruce_H21/p/10517655.html
Copyright © 2011-2022 走看看