0

我正在使用 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 上,那么我会看到以下内容,这是正确的:

奥拉普1

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

奥拉普2

因为这是 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 个单独的表(每个受益人一个),还是可以将同一个表用于多个维度?显然,每个成员都有一个数据库表并不理想,这样做有什么好处吗?

4

1 回答 1

2

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

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

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

在不同的层次结构中,type1 和 type2 之间没有任何关系,并且您只能获得所需的两个不同的字符串。

于 2014-09-24T08:08:29.883 回答