`

FoodmartSchema2012 解析

 
阅读更多

原文引用自:http://triffic.iteye.com/blog/1123760

BI中如何配置模式文件(Schema)

 

在这里系统的看看构成模式文件的元素:
首先说明一点:这个sample中每一部分在形式上有很多重复的地方,为了尽可能地讲的完全,所以在讲解的过程中,
每一部分提取形式上不重复的部分,然后加入该部分的一些可选项,同时可以查阅FoodMart.xml这个Schema文件。
从宏观上来看,配置一个Schema大致可以分成五部分,分别是:1、Table配置 2、Dimension配置 3、Measure配置 4、VirtualCube配置 5、访问权限配置。在本sample中已经标记出,下面分析每一部分中的元素构成。

<第一部分>
  <Table name="sales_fact_1997">
    <AggExclude name="agg_c_14_sales_fact_1997" />
    <AggName name="agg_c_special_sales_fact_1997">
        <AggFactCount column="FACT_COUNT"/>
        <AggIgnoreColumn column="foo"/>
        <AggForeignKey factColumn="product_id" aggColumn="PRODUCT_ID" />
        <AggMeasure name="[Measures].[Unit Sales]" column="UNIT_SALES_SUM" />
        <AggLevel name="[Time].[Year]" column="TIME_YEAR" />
    </AggName>
    <AggPattern pattern="agg_sales_fact_1997_.*">
        ....
      <AggExclude name="agg_sales_fact_1997_olddata" />
      <AggExclude pattern="agg_sales_fact_1997_test.*" />
  </AggPattern>
 </Table>
</第一部分>
1、首先给出表名,在一般情况下,一个Cube是建立在一张事实表之上的,所以Table name=某事实表,但也可以在一张基础表上建立Cube。
2、在本sample中加入了一个聚合表(aggregate table),在一个Cube中可以加,也可以不加,需要根据实际情况来决定。聚合表的作用简单的说表现在考虑报表设计时,通过聚合预先计算好数据汇总,从而改进查询响应的时间。聚合表的内容非常丰富,在这里只讲解最基本的概念,进一步了解请访问官网http://mondrian.pentaho.com/documentation/aggregate_tables.php,接下来简单的理解构成聚合表的元素。
3、AggExclude name,这里给出的表名旨在告诉Mondrian该表不是相应事实表的聚合表。
4、AggName name,这里给出的表名告诉Mondrian该表是相应事实表的聚合表
5、AggFactCount column="FACT_COUNT",这个字段在每一张聚合表中都存在,记录了相应的事实表中有多少列写入到聚合表中。
6、AggIgnoreColumn column,该列名的作用是告知Mondrian该列是已知的,应该被忽略。
7、<AggForeignKey factColumn="product_id" aggColumn="PRODUCT_ID"/>这里给出了一个映射关系,即事实表中的product_id列对应了聚合表中的PRODUCT_ID列。
8、AggMeasure name和AggLevel name这两个元素同样也给出了一个映射关系,即把在Cube的模式文件中定义的逻辑名映射到聚合表中的列名。
9、AggPattern pattern使用了正则表达式,把符合该pattern的聚合表包括进来。如在本sample中把前缀为agg_sales_fact_1997_的聚合表全部包括进来作为孩子元素。
10、AggPattern pattern中的AggExclude name元素,该元素很明确地指出在已包括进来的聚合表中,剔除某特定的聚合表。
11、AggPattern pattern中的AggExclude pattern元素,该元素的作用表现在把符合AggExclude pattern的正则表达式的聚合表剔除。
12、第一部分的完整框架是:
  <Table>
     <AggExclude>
     <AggName>
         <AggFactCount/>
         <AggIgnoreColumn/>
         <AggForeignKey/>
         <AggMeasure/>
         <AggLevel/>
     </AggName>
     <AggPattern>
       <AggExclude name/>
       <AggExclude pattern/>
   </AggPattern>
  </Table>

 

 

<第二部分>
  <DimensionUsage name="Store" source="Store" foreignKey="store_id"/>
  <Dimension name="Promotion Media" foreignKey="promotion_id">
    <Hierarchy hasAll="true" allMemberName="All Media" primaryKey="promotion_id" defaultMember="All Media">
      <Table name="promotion"/>
      <Level name="Media Type" column="media_type" uniqueMembers="true"/>
    </Hierarchy>
  </Dimension>
  <Dimension name="Customers" foreignKey="customer_id">
    <Hierarchy hasAll="true" allMemberName="All Customers" primaryKey="customer_id">
      <Table name="customer"/>
      <Level name="City" column="city" uniqueMembers="false"/>
      <Level name="Name" column="customer_id" type="Numeric" uniqueMembers="true">
        <NameExpression>
          <SQL dialect="oracle">"fname" || ' ' || "lname"</SQL>
          <SQL dialect="access">fname + ' ' + lname</SQL>
          <SQL dialect="postgres">"fname" || ' ' || "lname"</SQL>
          <SQL dialect="mysql">CONCAT(`customer`.`fname`, ' ', `customer`.`lname`)</SQL>
          <SQL dialect="mssql">fname + ' ' + lname</SQL>
          <SQL dialect="derby">"customer"."fullname"</SQL>
          <SQL dialect="db2">CONCAT(CONCAT("customer"."fname", ' '), "customer"."lname")</SQL>
          <SQL dialect="luciddb">"fname" || ' ' || "lname"</SQL>
          <SQL dialect="generic">fullname</SQL>
        </NameExpression>
        <OrdinalExpression>
          <SQL dialect="oracle">"fname" || ' ' || "lname"</SQL>
          <SQL dialect="access">fname + ' ' + lname</SQL>
          <SQL dialect="postgres">"fname" || ' ' || "lname"</SQL>
          <SQL dialect="mysql">CONCAT(`customer`.`fname`, ' ', `customer`.`lname`)</SQL>
          <SQL dialect="mssql">fname + ' ' + lname</SQL>
          <SQL dialect="derby">"customer"."fullname"</SQL>
          <SQL dialect="db2">CONCAT(CONCAT("customer"."fname", ' '), "customer"."lname")</SQL>
          <SQL dialect="luciddb">"fname" || ' ' || "lname"</SQL>
          <SQL dialect="generic">fullname</SQL>
        </OrdinalExpression>
        <Property name="Gender" column="gender"/>
        <Property name="Marital Status" column="marital_status"/>
        <Property name="Education" column="education"/>
        <Property name="Yearly Income" column="yearly_income"/>
      </Level>
    </Hierarchy>
  </Dimension>
</第二部分>
1、DimensionUsage元素:如果在之前定义了共享维(shared dimensions),并且在该Cube中想要使用该共享维,
那么就如<DimensionUsage name="Store" source="Store" foreignKey="store_id"/>使用,通过store_id把
事实表sales_fact_1997和基础表Store相连接。
2、<Dimension name="Promotion Media" foreignKey="promotion_id">
    <Hierarchy hasAll="true" allMemberName="All Media" primaryKey="promotion_id" defaultMember="All Media">
      <Table name="promotion"/>
      <Level name="Media Type" column="media_type" uniqueMembers="true"/>
    </Hierarchy>
   </Dimension>
  定义了一个名为Promotion Media的维,通过promotion_id连接基础表promotion和事实表sales_fact_1997。
 <Level name="Media Type" column="media_type" uniqueMembers="true"/>定义了一个层次中的级别,选择了基础表promotion的media_type字段,不包括该表中的其他字段。
3、在本上面的例子中又定义了一个名为Customers的demension,通过字段customer_id连接基础表customer和事实表sales_fact_1997。接下来来解释下其他元素的作用:
 <Level name="XXXX" column="XXXX" type="XXXX" uniqueMembers="XXXX">
    <KeyExpression>
     SQL表达式,用于该级别的key,代替了column
    </KeyExpression>
    <CaptionExpression>
     SQL表达式,用于计算一个成员的标题,代替了Level.captionColumn
    </CaptionExpression>
    <ParentExpression>
     SQL表达式,用于计算一个度量,代替了Level.parentColumn
    </ParentExpression>
        <NameExpression>
          SQL表达式,用于计算一个成员的名字,代替了Level.nameColumn
        </NameExpression>
        <OrdinalExpression>
          SQL表达式,用于对一个level的所有成员进行排序,代替了Level.ordinalColumn
        </OrdinalExpression>
        <Property name="XXXX" column="XXXX">
         <PropertyExpression>
          SQL表达式,用于计算一个属性的值,代替了Property.column
         </PropertyExpression>
        </Property>
  </Level>
4、第二部分的完整框架是:
  <DimensionUsage/>
   <Dimension>
     <Hierarchy>
       <Table name=/>
       <Level name=/>
     </Hierarchy>
   </Dimension>
   <Dimension name>
     <Hierarchy>
       <Table name=/>
       <Level name=/>
       <Level name=>
         <KeyExpression>
      <SQL dialect></SQL>
     </KeyExpression>
     <CaptionExpression>
      <SQL dialect></SQL>
     </CaptionExpression>
     <ParentExpression>
      <SQL dialect></SQL>
     </ParentExpression>
         <NameExpression>
           <SQL dialect></SQL>
         </NameExpression>
         <OrdinalExpression>
           <SQL dialect></SQL>
         </OrdinalExpression>
         <Property name="XXXX" column="XXXX">
          <PropertyExpression>
           <SQL dialect></SQL>
          </PropertyExpression>
         </Property>
       </Level>
     </Hierarchy>
   </Dimension>

 

 

<第三部分>
  <Measure name="Unit Sales" column="unit_sales" aggregator="sum" formatString="Standard"/>
  <Measure name="Promotion Sales" aggregator="sum" formatString="#,###.00">
    <MeasureExpression>
      <SQL dialect="oracle">(case when "sales_fact_1997"."promotion_id" = 0 then 0 else "sales_fact_1997"."store_sales" end)</SQL>
    </MeasureExpression>
  </Measure>
  <CalculatedMember name="Profit" dimension="Measures">
    <Formula>[Measures].[Store Sales] - [Measures].[Store Cost]</Formula>
    <CalculatedMemberProperty name="FORMAT_STRING" value="$#,##0.00"/>
  </CalculatedMember>
</第三部分>
1、第一个Measure的名字是Unit Sales,对应事实表中的unit_sales列,聚合的方法是求和(还可以是:sum,count,min,max,avg,distinct-count),求和之后的结果格式为标准格式。
2、第二个Measure的名字是Promotion Sales,在该Measure下加入了一个MeasureExpression。期望是:从事实表sales_fact_1997中挑选出promotion_id=0的所有行,然后对该事实表的store_sales进行求和(如果某行的sales_fact_1997.store_sales=0,则不对该行进行计算)
3、CalculatedMember元素是一个计算成员,在本sample中取名Profit,属于Measures维。期望是:商店的销售额减去商店的成本得到利润值,得到的值的类型是字符串类型,值的格式是$#,##0.00
4、第三部分一个完整的框架是:
  <Measure>
   <MeasureExpression>
    <SQL/>
   </MeasureExpression>
  </Measure>
  <CalculatedMember>
   <Formula/>
   <CalculatedMemberProperty/>
  </CalculatedMember>
  <NamedSet>
   该集合的值是由公式推导出的,是Cube的组成部分
  </NamedSet>
  

 

<第四部分>
 <VirtualCube name="Warehouse and Sales" defaultMeasure="Store Sales">
   <VirtualCubeDimension cubeName="Sales" name="Customers"/>
   <VirtualCubeDimension name="Product"/>
   <VirtualCubeMeasure cubeName="Sales" name="[Measures].[Sales Count]"/>
   <CalculatedMember name="Profit Per Unit Shipped" dimension="Measures">
     <Formula>[Measures].[Profit] / [Measures].[Units Shipped]</Formula>
   </CalculatedMember>
 </VirtualCube>
</第四部分>
1、VirtualCube,A cube defined by combining the dimensions and measures of one or more cubes. A measure originating from another cube can be a <CalculatedMember>.即若干个Cube中的dimension和measure相结合形成一个Cube,该Cube就叫做VirtualCube。来自另一个Cube的measure可以是该VirtualCube的计算成员。
2、在本sample中定义了一个叫Warehouse and Sales的多维虚拟分析主题,VirtualCubeDimension定义了一个来自Sales的Cube,并且选择了该Cube中的Customers维。注意在VirtualCubeDimension的定义中还有另一种方法,如<VirtualCubeDimension name="Product"/>,这是针对共享维的使用方法。
3、VirtualCubeMeasure定义了一个来自Sales的Cube,并且选择了该Cube中的Sales Count度量。
4、CalculatedMember定义了一个计算成员,使用方法和一般的Cube一样。
5、第四部分一个完整的框架是:
  <VirtualCube>
   <CubeUsages>
    <CubeUsage>
    </CubeUsage>
   </CubeUsages>
   
    <VirtualCubeDimension>
    </VirtualCubeDimension>
    
   <VirtualCubeMeasure>
   </VirtualCubeMeasure>
   
   <CalculatedMember>
   </CalculatedMember>
  </VirtualCube>
  或者如本sample中的写法,即把在VirtualCube中要使用到的Cube写在<VirtualCubeDimension>,<VirtualCubeMeasure>和<CalculatedMember>中,
  从而不需要在<CubeUsages>中定义。
 

  

<第五部分>
<Role name="California manager">
  <SchemaGrant access="none">
    <CubeGrant cube="Sales" access="all">
      <HierarchyGrant hierarchy="[Store]" access="custom" topLevel="[Store].[Store Country]">
        <MemberGrant member="[Store].[USA].[CA]" access="all"/>
        <MemberGrant member="[Store].[USA].[CA].[Los Angeles]" access="none"/>
      </HierarchyGrant>
      <HierarchyGrant hierarchy="[Gender]" access="none"/>
    </CubeGrant>
  </SchemaGrant>
</Role>
</第五部分>
1、该部分属于访问控制配置文件
2、Role定义了一个访问者
3、SchemaGrant是一个访问Schema的权利的集合
4、CubeGrant是一个访问Cube的权利的集合
5、HierarchyGrant是一个访问该层次以及属于该层次的级别的权利的集合
6、MemberGrant是一个访问成员以及该成员的孩子的权利的集合
在理解上述元素的情况下,我们来了解在本sample中该部分的作用:首先定义了一个访问用户,是California manager(加州经理),他不能访问整个Schema中的Cube,但他可以访问Sales这个Cube。其次,自定义了对该Sales Cube中的Store这个层次的访问控制,他可以访问位于美国加州的store(除了洛杉矶)。最后定义了他对该Sales Cube中的Gender层次无访问权限。
7、第五部分的完整框架是:
  <Role>
    <SchemaGrant>
      <CubeGrant>
        <HierarchyGrant>
          <MemberGrant/>
        </HierarchyGrant>
        <HierarchyGrant>
      </CubeGrant>
    </SchemaGrant>
  </Role>

分享到:
评论

相关推荐

    原生js图片圆形排列按钮控制3D旋转切换插件.zip

    原生js图片圆形排列按钮控制3D旋转切换插件.zip

    类似c++数组的python包

    内含二维数组与三维数组,分别为list2nd,list3rd

    原生js颜色随机生成9x9乘法表代码.zip

    原生js颜色随机生成9x9乘法表代码.zip

    原生js实现图片叠加滚动切换代码.zip

    原生js实现图片叠加滚动切换代码.zip

    【Academic tailor】学术小裁缝必备知识点:全局注意力机制(GAM)TensorFlow

    【Academic tailor】学术小裁缝必备知识点:全局注意力机制(GAM) 注意力机制是深度学习中的重要技术,尤其在序列到序列(sequence-to-sequence)任务中广泛应用,例如机器翻译、文本摘要和问答系统等。这一机制由 Bahdanau 等人在其论文《Neural Machine Translation by Jointly Learning to Align and Translate》中首次提出。以下将详细介绍这一机制的背景、核心原理及相关公式。 全局注意力机制(Global Attention Mechanism, GAM)由 《Global Attention Mechanism: Retain Information to Enhance Channel-Spatial Interactions》提出,是一篇针对计算机视觉任务提出的方法。这篇文章聚焦于增强深度神经网络中通道和空间维度之间的交互,以提高分类任务的性能。与最早由 Bahdanau 等人提出的用于序列到序列任务的注意力机制 不同,这篇文章的重点是针对图像分类任务,并未专注于序

    基于SpringBoot的“篮球论坛系统”的设计与实现(源码+数据库+文档+PPT).zip

    本项目在开发和设计过程中涉及到原理和技术有: B/S、java技术和MySQL数据库等;此文将按以下章节进行开发设计; 第一章绪论;剖析项目背景,说明研究的内容。 第二章开发技术;系统主要使用了java技术, b/s模式和myspl数据库,并对此做了介绍。 第三章系统分析;包罗了系统总体结构、对系统的性能、功能、流程图进行了分析。 第四章系统设计;对软件功能模块和数据库进行详细设计。 第五章系统总体设计;对系统管理员和用户的功能进行描述, 第六章对系统进行测试, 第七章总结心得;在论文最后结束章节总结了开发这个系统和撰写论文时候自己的总结、感想,包括致谢。

    毕业设计&课设_iOS 商城项目,含购物与商家管理功能,用 Sqlite,有账号示例,适合 iOS 开发练习.zip

    1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。

    镗夹具总工艺图.dwg

    镗夹具总工艺图

    原生js树叶数字时钟代码.rar

    原生js树叶数字时钟代码.rar

    近代非线性回归分析-韦博成1989

    近代非线性回归分析-韦博成1989

    Rust语言中冒泡排序算法的高效实现与优化

    内容概要:本文详细介绍了用 Rust 语言实现冒泡排序算法的具体步骤,以及通过设置标志位来优化算法性能的方法。示例代码包括了函数定义、内外层循环逻辑、标志位的应用,并在主函数中展示了如何调用 bubble_sort 函数并显示排序前后的数组。 适合人群:具有基本 Rust 编程基础的学习者和开发者。 使用场景及目标:适用于想要深入了解 Rust 中冒泡排序实现方式及其优化技巧的技术人员。通过本篇文章,能够掌握 Rust 基本语法以及算法优化的基本思想。 阅读建议:除了仔细阅读和理解每一部分的内容外,还可以尝试修改代码,改变数据集大小,进一步探索冒泡排序的时间复杂度和优化效果。此外,在实际应用时也可以考虑引入并发或其他高级特性以提升性能。

    培训课件 -安全隐患分类与排查治理.pptx

    培训课件 -安全隐患分类与排查治理.pptx

    1-中国各地级市的海拔标准差-社科数据.zip

    中国各地级市的海拔标准差数据集提供了298个地级市的海拔变异性信息。海拔标准差是衡量某地区海拔高度分布离散程度的统计指标,它通过计算各测量点海拔与平均海拔之间的差异来得出。这一数据对于评估地形起伏对网络基础设施建设的影响尤为重要,因为地形的起伏度不仅会增加建设成本,还会影响信号质量。此外,由于地形起伏度是自然地理变量,它与经济社会因素关联性较小,因此被用作“宽带中国”试点政策的工具变量,以研究网络基础设施建设对经济的影响。数据集中包含了行政区划代码、地区、所属省份、所属地域、长江经济带、经度、纬度以及海拔标准差等关键指标。这些数据来源于地理空间数据云,并以Excel和dta格式提供,方便研究者进行进一步的分析和研究。

    YOLO算法的原理与实现.pdf

    YOLO算法的原理与实现

    机器学习用于视网膜病变预测:使用 XGBoost 揭示年龄和HbA1c 的重要性 -论文

    视网膜病变是糖尿病和高血压的主要微血管并发症。如果不及时治疗,可能会导致失明。据估计,印度三分之一的成年人患有糖尿病或高血压,他们未来患视网膜病变的风险很高。我们研究的目的是检查糖化血红蛋白 (HbA1c)、血压 (BP) 读数和脂质水平与视网膜病变的相关性。我们的主要假设是,血糖控制不佳(表现为高 HbA1c 水平、高血压和异常脂质水平)会导致视网膜病变风险增加。我们使用眼底照相机筛查了 119 名印度患者的视网膜病变,并获取了他们最近的血压、HbA1c 和血脂谱值。然后,我们应用 XGBoost 机器学习算法根据他们的实验室值预测是否存在视网膜病变。我们能够根据这些关键生物标志物高精度地预测视网膜病变。此外,使用 Shapely Additive Explanations (SHAP),我们确定了对模型最重要的两个特征,即年龄和 HbA1c。这表明血糖控制不佳的老年患者更有可能出现视网膜病变。因此,这些高风险人群可以成为早期筛查和干预计划的目标,以防止视网膜病变发展为失明。

    RL Base强化学习:信赖域策略优化(TRPO)算法TensorFlow实现

    在强化学习(RL)领域,如何稳定地优化策略是一个核心挑战。2015 年,由 John Schulman 等人提出的信赖域策略优化(Trust Region Policy Optimization, TRPO)算法为这一问题提供了优雅的解决方案。TRPO 通过限制策略更新的幅度,避免了策略更新过大导致的不稳定问题,是强化学习中经典的策略优化方法之一。

    Spring 应用编译为原生可执行文件.zip

    1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。

    1-中国各地区普通小学毕业生数(1999-2020年)-社科数据.zip

    这组数据涵盖了1999至2020年间中国各地区普通小学毕业生的数量。它为我们提供了一个深入了解中国教育领域中普通小学阶段教育水平和教育资源分配情况的窗口。通过分析这些数据,可以为制定科学合理的教育政策提供依据,同时,通过比较不同城市的普通小学毕业生数,也能为城市规划和劳动力市场调查提供参考。数据来源于中国区域统计年鉴和中国各省市统计年鉴,包含了8472个样本,以面板数据的形式呈现。这些数据对于掌握中国教育态势具有重要的参考价值。

    原生js制作拖拽排列排序代码.zip

    原生js制作拖拽排列排序代码.zip

    PixPin截图工具,非常好用的一款截图工具

    PixPin截图工具,非常好用的一款截图工具

Global site tag (gtag.js) - Google Analytics