最近我正在尝试使用Saiku http://meteorite.bi/saiku。 我有一个mysql表,它存储每天的统计信息。其架构如下所示:
CREATE TABLE `f_android_active_user_data` (
`event_date` date DEFAULT NULL,
`channel_id` varchar(100) DEFAULT NULL,
`version` varchar(100) DEFAULT NULL,
`active_user_count` int(11) NOT NULL DEFAULT '0'
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
现在我想将event_date配置为维度,但是,我没有看到如何使用表格自己的列作为维度的示例。似乎关于Saiku的材料并不多。有人可以帮忙解决这个问题吗?
答案 0 :(得分:1)
不建议对数据集市进行平台设计,但这并非不可能。
作为对本书保持非常严格的人(在实践中表现得最好),我必须建议你在单独的表中创建时间维度。甚至将日期作为time_dimension_table中的主键,并且作为连接也不是太糟糕的解决方案。
选项1 - 最简单,最差的
在架构mondarian.xml中定义维度:
<Dimension type="TimeDimension" visible="true" highCardinality="false" name="DateDimension">
<Hierarchy visible="true" hasAll="true" primaryKey="event_date">
<Table name="f_android_active_user_data" schema="public">
</Table>
<Level name="DateLevel" visible="true" column="event_date" type="String" uniqueMembers="false" levelType="TimeDays" hideMemberIf="Never">
</Level>
</Hierarchy>
</Dimension>
然后,在您的多维数据集内定义维度用法:
<DimensionUsage source="DateDimension" name="DateDimension" visible="true" foreignKey="event_date" highCardinality="false">
</DimensionUsage>
选项2 - 创建DateDimension表并仍使用自然键进行连接
按照此tutorial创建DateDimension。确保覆盖事实表中的第一个显示日期(f_android_active_user_data)。 在这种情况下,定义维度将稍有改变:
请注意,您可以按月,季度,年等过滤和分组
<Dimension type="TimeDimension" visible="true" highCardinality="false" name="DateDimension">
<Hierarchy visible="true" hasAll="true" primaryKey="dt">
<Table name="calendar_table" schema="public">
</Table>
<Level name="YearLevel" visible="true" column="y" type="Numeric" uniqueMembers="false" levelType="TimeYears" hideMemberIf="Never">
</Level>
<Level name="MonthLevel" visible="true" column="m" type="Numeric" uniqueMembers="false" levelType="TimeMonths" hideMemberIf="Never">
</Level>
<Level name="DateLevel" visible="true" column="dt" type="String" uniqueMembers="false" levelType="TimeDays" hideMemberIf="Never">
</Level>
</Hierarchy>
</Dimension>
选项3 - Kimball会感到自豪
使用选项2中链接的教程,但将PK INTEGER PRIMARY KEY添加为AUTO INCREMENT。 运行此查询onse:
ALTER table f_android_active_user_data ADD column DATE_FK INTEGER DEFAULT NULL
UPDATE f_android_active_user_data
SET DATE_FK = calendar_table.PK
FROM calendar_table
WHERE f_android_active_user_data.event_date = calendar_table.dt
现在,只剩下设置触发器了: 最好是在INSERT TRIGER之后:
UPDATE f_android_active_user_data
SET DATE_FK = calendar_table.PK
FROM calendar_table
WHERE f_android_active_user_data.event_date = calendar_table.dt AND DATE_FK = NULL