蒙德里安模式 uniqueMembers

Posted

技术标签:

【中文标题】蒙德里安模式 uniqueMembers【英文标题】:Mondrian Schema uniqueMembers 【发布时间】:2014-09-23 12:56:21 【问题描述】:

我正在使用 Mondrian 与 Pentaho 和 Saiku 对 mysql 数据库进行 OLAP 分析。 我有一个链接到事实表的二维数据仓库(受益人和成员)。 Beneficiary 有以下字段:beneficiary_type1、beneficiary_type2、beneficiary_type3。 成员有一个性别字段。

我创建了一个蒙德里安模式,定义如下:

<Dimension type="StandardDimension" visible="true" foreignKey="beneficiary_id" highCardinality="false" name="beneficiary">
  <Hierarchy visible="true" hasAll="true" primaryKey="id">
    <Table name="beneficiary">
    </Table>
    <Level name="beneficiary_type1" visible="true" column="beneficiary_type1" type="String" uniqueMembers="true" levelType="Regular" hideMemberIf="Never">
    </Level>
    <Level name="beneficiary_type2" visible="true" column="beneficiary_type2" type="String" uniqueMembers="false" levelType="Regular" hideMemberIf="Never">
    </Level>
    <Level name="beneficiary_type3" visible="true" column="beneficiary_type3" type="String" uniqueMembers="false" levelType="Regular" hideMemberIf="Never">
    </Level>
  </Hierarchy>
</Dimension>

<Dimension type="StandardDimension" visible="true" foreignKey="member_id" highCardinality="false" name="member">
  <Hierarchy visible="true" hasAll="true" primaryKey="id">
    <Table name="member">
    </Table>
    <Level name="gender" visible="true" column="gender" type="String" uniqueMembers="true" levelType="Regular" hideMemberIf="Never">
    </Level>
  </Hierarchy>
</Dimension>

我希望能够(单独)查看: beneficiary_type1 的男性/女性人数, beneficiary_type2 的男性/女性数量, beneficiary_type3 的男性/女性数量,

如果我将性别拖到 beneficiary_type1 上,那么我会看到以下内容,这是正确的:

如果我将性别拖到 beneficiary_type2 上,我会看到以下内容,这是不正确的:

因为这是 beneficiary_type2 列,按 benefiiary_type1 分组,添加两个字段时可以看到:

在通过 beneficiary_type2 查看性别时,我希望只看到 2 行,即“成人”和“19 岁以下儿童”。根据我的阅读,似乎应该在 beneficiary_type2 级别设置 uniqueMembers 属性,但这会导致以下结果:

这会产生正确的编号结果,但行仍然显示为好像按 beneficiary_type1 分组一样。此外,这种方式不允许像在第三个图像中那样在 beneficiary_type1 下正确分组的 beneficiary_type2 的生成(编号的结果永远不会根据父级别进行分组)。

我应该如何构建架构以使我包含在分析中的父级别确定的行数? (使用 saiku 拖入立方体)即当拖入 beneficiary_type1 和 beneficiary_type2 然后 beneficiary_type2 根据 beneficiary_type1 分组(如第三张图像),如果只有 beneficiary_type2 则根据其自己的唯一值分组(2行,一个用于“成人” ”和一个用于“19 岁以下的儿童”)。

我对 OLAP 比较陌生,所以可能有一些我不明白的基本概念。请不要犹豫,提出任何解释。

-------- 更新 -------- 正如@nsousa 所解释的,同一层次结构中的成员意味着父子关系。以下是对架构的正确更改吗?

<Dimension type="StandardDimension" visible="true" foreignKey="beneficiary_id" highCardinality="false" name="beneficiary">
  <Hierarchy visible="true" hasAll="true" primaryKey="id">
    <Table name="beneficiary">
    </Table>
    <Level name="beneficiary_type1" visible="true" column="beneficiary_type1" type="String" uniqueMembers="true" levelType="Regular" hideMemberIf="Never">
    </Level>
  </Hierarchy>
  <Hierarchy visible="true" hasAll="true" primaryKey="id">
    <Table name="beneficiary">
    </Table>
    <Level name="beneficiary_type2" visible="true" column="beneficiary_type2" type="String" uniqueMembers="false" levelType="Regular" hideMemberIf="Never">
    </Level>
  </Hierarchy>
  <Hierarchy visible="true" hasAll="true" primaryKey="id">
    <Table name="beneficiary">
    </Table>
    <Level name="beneficiary_type3" visible="true" column="beneficiary_type3" type="String" uniqueMembers="false" levelType="Regular" hideMemberIf="Never">
    </Level>
  </Hierarchy>
</Dimension>

我是否正确理解替代解决方案是为受益人表加载 3 个单独的维度?这是否意味着数据库中也需要存在 3 个单独的表(每个受益人一个),还是可以将同一个表用于多个维度?显然,每个成员都有一个数据库表并不理想,这样做有什么好处吗?

【问题讨论】:

【参考方案1】:

您的 beneficiary_type2 级别是 beneficiary_type1 的后代。因此,即使成员名称匹配,2 级上的两个“成人”也不是同一个成员,除非他们也有相同的父级。

因为他们有不同的父母,所以他们是同名的堂兄弟。因此,您会得到多行。

唯一安全的方法是将各个级别拆分为多个维度/层次结构,而不是拥有父子层次结构。

在不同的层次结构中,type1 和 type2 之间没有任何关系,你只能得到你想要的两个不同的字符串。

【讨论】:

感谢 nsousa 的及时和明确的回答。我已经编辑了我的问题,请您检查我的理解是否正确?与此相关的还有什么值得考虑的吗? 即使您将 uniqueMembers 设置为 true,也不会产生影响。 uniqueMembers="true" 的作用是允许mondrian 直接在级别上进行过滤,而不是在SQL 的Where 子句中添加多个条件,每个级别一个。如果您希望将您的第 2 层视为第 1 层,那么您需要创建不同的层次结构。

以上是关于蒙德里安模式 uniqueMembers的主要内容,如果未能解决你的问题,请参考以下文章

蒙德里安非星型模式,多个事实表

使用蒙德里安模式的数据仓库中的多对多维度

蒙德里安有本地客户吗? [关闭]

AcWing 291.蒙德里安的梦想

JPivot 显示蒙德里安结果

蒙德里安的日期范围