Mondrian 4: Get ready!

蒙德里安4:做好准备!

Mondrian是一种非常流行的开源分析引擎,可用于各种产品(如Pentaho BA Server,JasperSoft BI Server)。Mondrian 4带来了一大堆新功能,其中一些我们将在这篇博客文章中讨论。

条件

  • 您熟悉XML

  • 您熟悉OLAP

  • 您熟悉Linux OS或Mac OS上的命令行。

  • 这里下载Eclipse IDE for Java EE Developers 。用户不熟悉Java,不用担心,我们不会写单行Java!我们将仅使用Eclipse来创建OLAP架构。

  • 这里下载Mondai 4版本的Saiku 。我们将使用它来测试模式。请注意,该分支正在积极开发中,不适合生产使用!如果您需要用于生产的版本(目前没有Mondrian 4支持),请从主网站下载。

  • 这篇文章实际上不是一步一步的教程,更多是一种概述,因此建议您拥有一个数据集(理想情况下是数据集市),以便您可以跟随并创建自己的OLAP架构。

  • 我可以在这里下载与此帖相关的所有文件。

什么是新的

  • 现在使用Attributes松散地设置尺寸。它可以是层次结构的一部分,但它们不必。如果在层次结构中定义,它们仍然可以单独使用。

  • MeasureGroups可用于从多个事实表(具有相同的维度和粒度)定义度量。

    • 不再有聚合模式,使用MeasureGroups来定义聚合。

    • 虚拟多维数据集已折旧

  • Schema Workbench已停产。在您选择的文本/ XML编辑器中编写OLAP架构

  • 没有XMLA服务器,分拆项目OLAP4J xmla服务器

  • 内置时间维度生成器

快速概述新语法

我们将很快对新语法进行高级概述。我强烈建议您获取即将出版的Mondrian In Action一书,获取更详细的说明。此外,如果您不知道XML元素或属性的用途,可以在Mondrian API文档中找到说明

高水平的结构

请在下面找到OLAP架构定义的简化结构概述:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE Schema SYSTEM "mondrian.dtd" >
<Schema metamodelVersion="4.0">
 <!-- Define how the DB tables are set up -->
 <PhysicalSchema>
  <!-- Specify source tables -->
  <Table/>
  <!-- Define relationships between snowflake or alias tables, not direct dim tables! -->
  <Link/>
 </PhysicalSchema>
 <!-- Create your cube definition and reference back to the physical schema -->
 <Cube>
  <!-- Define dimensions and attributes -->
  <Dimensions>
   <Dimension>
    <Attribute/>
   </Dimension>
   <Hierarchies>
    <Hierarchy>
     <Level/>
    </Hierarchy>
   </Hierarchies>
  </Dimensions>
  <!-- Define Measures -->
  <MeasureGroups>
   <MeasureGroup>
    <Measures>
     <Measure/>
    </Measures>
    <DimensionLinks>
     <ForeignKeyLink/>
     <FactLink/>
    </DimensionLinks>
   </MeasureGroup>
  </MeasureGroups>
  <!-- Define Calculated Members and Names Sets -->
  <CalculatedMembers/>
  <NamedSets/>
 </Cube>
 <!-- If you have conformed dimensions, specify them globally.-->
 <Dimension>
 <!-- Define roles below to restrict access to the cube(s). -->
 <Role>
</Schema>

请注意,Mondrian 4对您提到这些构建块的顺序不敏感,因此您可以在示例中的物理模式之前提及该多维数据集。

如何定义物理架构

物理模式定义了数据库表的设置方式:

<PhysicalSchema>
       <Table name='employee'>
           <Key>
               <Column name='employee_id'/>
           </Key>
       </Table>
       <Table name='store'>
           <Key>
               <Column name='store_id'/>
           </Key>
       </Table>
       <Link source='store' target='employee'>
           <ForeignKey>
               <Column name='store_id'/>
           </ForeignKey>
       </Link>
…
</PhysicalSchema>

注意:<Link>元素仅用于描述与别名表或雪花表的关系(因此,与事实表相距多个链接的表)。

如何定义尺寸

使用<Dimension>元素定义维度,使用<Attribute>元素定义其成员。默认情况下,Mondrian将为您创建的每个属性创建一个层次结构,除非您指定<Attribute hasHierarchy =“false”>。有一个可选的<Hiearchy>元素,用于指定多级层次结构。

<Dimension name='Promotion' table='promotion' key='Promotion Id'>
               <Attributes>
                   <Attribute name='Promotion Id' keyColumn='promotion_id' hasHierarchy='false'/>
                   <Attribute name='Promotion Name' keyColumn='promotion_name' hasHierarchy='false'/>
                   <Attribute name='Media Type' keyColumn='media_type' hierarchyAllMemberName='All Media' hasHierarchy='false'/>
               </Attributes>
               <Hierarchies>
                   <Hierarchy name='Media Type' allMemberName='All Media'>
                       <Level attribute='Media Type'/>
                   </Hierarchy>
                   <Hierarchy name='Promotions' allMemberName='All Promotions'>
                       <Level attribute='Promotion Name'/>
                   </Hierarchy>
               </Hierarchies>
           </Dimension>

Mondrian 4的一大优势是,即使它们属于多级层次结构,您现在也可以自己使用属性!

如何定义措施

使用<MeasureGroup>元素定义度量。在<DimensionLinks>元素中,您可以为与此MeasureGroup相关的所有维度定义外键:

<MeasureGroups>
           <MeasureGroup name='Sales' table='sales_fact_1997'>
               <Measures>
                   <Measure name='Unit Sales' column='unit_sales' aggregator='sum' formatString='Standard'/>
                   <Measure name='Store Cost' column='store_cost' aggregator='sum' formatString='#,###.00'/>
                   <Measure name='Store Sales' column='store_sales' aggregator='sum' formatString='#,###.00'/>
                   <Measure name='Sales Count' column='product_id' aggregator='count' formatString='#,###'/>
                   <Measure name='Customer Count' column='customer_id' aggregator='distinct-count' formatString='#,###'/>
                   <Measure name='Promotion Sales' column='promotion_sales' aggregator='sum' formatString='#,###.00' datatype='Numeric'/>
               </Measures>
               <DimensionLinks>
                   <ForeignKeyLink dimension='Store' foreignKeyColumn='store_id'/>
                   <ForeignKeyLink dimension='Time' foreignKeyColumn='time_id'/>
                   <ForeignKeyLink dimension='Product' foreignKeyColumn='product_id'/>
                   <ForeignKeyLink dimension='Promotion' foreignKeyColumn='promotion_id'/>
                   <ForeignKeyLink dimension='Customer' foreignKeyColumn='customer_id'/>
               </DimensionLinks>
           </MeasureGroup>
</MeasureGroups>

如何定义聚合表

在以前的版本中,配置聚合表对于许多用户来说是一个混乱的区域。值得庆幸的是,随着Mondrian 4的到来,大大简化了这一点。现在,聚合表可以在<PhysicalSchema>内的OLAP模式中直接引用,并在<MeasureGroup>元素内正确定义。

<PhysicalSchema>
 …
<Table name='agg_c_special_sales_fact_1997'/>
<Table name='agg_pl_01_sales_fact_1997'/>
<Table name='agg_l_05_sales_fact_1997'/>
<Table name='agg_g_ms_pcat_sales_fact_1997'/>
<Table name='agg_c_14_sales_fact_1997'/>
</PhysicalSchema>
…
<MeasureGroups>
  …
           <MeasureGroup table='agg_c_special_sales_fact_1997' type='aggregate'>
               <Measures>
                   <MeasureRef name='Fact Count' aggColumn='fact_count'/>
                   <MeasureRef name='Unit Sales' aggColumn='unit_sales_sum'/>
                   <MeasureRef name='Store Cost' aggColumn='store_cost_sum'/>
                   <MeasureRef name='Store Sales' aggColumn='store_sales_sum'/>
               </Measures>
               <DimensionLinks>
                   <ForeignKeyLink dimension='Store' foreignKeyColumn='store_id'/>
                   <ForeignKeyLink dimension='Product' foreignKeyColumn='product_id'/>
                   <ForeignKeyLink dimension='Promotion' foreignKeyColumn='promotion_id'/>
                   <ForeignKeyLink dimension='Customer' foreignKeyColumn='customer_id'/>
                   <CopyLink dimension='Time' attribute='Month'>
                       <Column aggColumn='time_year' table='time_by_day' name='the_year'/>
                       <Column aggColumn='time_quarter' table='time_by_day' name='quarter'/>
                       <Column aggColumn='time_month' table='time_by_day' name='month_of_year'/>
                   </CopyLink>
               </DimensionLinks>
           </MeasureGroup>
</MeasureGroups>

 

 

在Eclipse中创建OLAP架构

您可以在任何文本编辑器,XML编辑器或IDE中创建Mondrian OLAP架构。Eclipse是一个非常流行的IDE,在这里将作为一个例子。

我创建了一个基于Mondrian lib文件夹(链接到原始Mondrian 4 DTD)中的DTD文件的XSD ,以便能够验证XML文件(实际的OLAP模式)。目前,这个DTD不适合验证OLAP架构XML文档(Julian指出他为架构添加了多个继承。他创建了这个JIRA案例来解决这个问题)。所以,我基本上做了,这是一个非常快速的解决方案,是通过转换输出一个XSD运行DTD然后我很快修复了我遇到的一些问题。我针对我的一个XML文件测试了这个XSD,而对于运行良好的Foodmart测试了这个XSD。我确信此架构(XSD)需要更多工作,因此请使用此帖子上的评论功能向我报告您遇到的任何问题。

在这里下载我的Mondrian XSD版本mondria4.xsd 。

请不要混淆:XSD(X ML S chema D efinition的缩写)是一个定义XML文档结构的文件。XSD是DTD(D ocument T ype D efinition)的继承者,并且更强大。在我们的案例中,XML文档(我们将基于此XSD创建)恰好称为Mondrian OLAP Schema(我将尝试将其称为XML文件)。
打开Eclipse并创建一个名为Mondrian4Schema 的新项目(而不是Java项目)。将XSD文件直接放在项目文件夹中。创建XML文件的最简单方法是右键单击XSD文件,然后选择Generate> XML File:

接下来指定Root元素,在我们的例子中是Schema :

将为您创建一个基本的XML结构。熟悉XML的人可能希望直接跳转到源视图并开始在那里工作。

对于不熟悉XML的人,只需右键单击节点,即可使用“ 大纲” 面板添加元素和属性:

在将xml文件上载到服务器之前,您应该验证它。右键单击xml文件,然后选择Validate :

注意:此验证仅检查XML文件是否与XSD文件中的结构定义匹配。因此,它不会检查您是否引用了正确的表,如果关系是正确的等等。我们可以将其称为第一次检查。第二项检查将是了解xml文件在逻辑上是否正确 - 这将通过在Mondrian上运行它(即通过Saiku)并分析错误消息(如果有的话)来完成。然后进行第三次检查,看看数据是否正确/尺寸和测量是否符合预期 - 通过像Saiku这样的图形界面进行测试。

在Eclipse中使用XML模板

为了让您的生活更轻松,请根据模板启动OLAP架构。我创建了一个模板,您可以在此处下载并用于以下步骤。您也可以创建自己的。

请注意,示例模板要求XSD文件与您创建的xml文件位于同一文件夹中。您可以通过指向公共XSD轻松避免此依赖关系。

复制模板文件的内容。

转到Preferences  并选择XML> XML Files> Editor> Templates ,然后单击New :

提供名称和描述。将Context 设置为New XML 并将模板的内容粘贴到Pattern中:

单击完成。

现在,当您创建新的XML文件时,可以从XML模板中选择Create XML file :

然后您可以选择我们之前设置的模板:

使用模板应该可以节省很多时间,不熟悉Mondrian模式的用户将有一个更容易的入口点。

如何将OLAP架构上载到BI Server

Schema Workbench具有将XML文件上载到BI Server的非常有用的选项。现在有很多替代方案......你也可以使用Filezilla或类似的FTP客户端将文件上传到远程服务器。稍后,我将向您展示如何将XML文件直接从Eclipse导出到本地Web服务器。

在本地使用Saiku测试Mondrian 4 Schema

 

设置Saiku

Mondrian 4版本的当前下载位置(2013-01-14):http
//ci.analytical-labs.com/job/saiku-mondrian4/

如果您安装了Pentaho BI Server,那么您只需下载该插件即可。否则,如果您想拥有独立版本,请下载Saiku Server。

以下说明适用于独立的Saiku服务器:
如果您不熟悉Saiku服务器,请阅读此简短介绍。

我解压缩了我的主文件夹中的文件。让我们准备好并启动服务器:

cd~ / saiku-server
chmod -R 700 * .sh
sh ./start-saiku.sh

等待一分钟左右,直到服务器准备就绪,然后检查您是否可以在浏览器中访问它:

http:// localhost:8080
用户名:admin
密码:admin

如果可以访问Web界面,请执行以下步骤:

将Mondrian XML文件导出到本地测试服务器

我们本可以在Eclipse中创建一个Dynamic Web Project并将其部署在服务器上,但这可能有点过于雄心勃勃。从我们的Eclipse项目导出到服务器的xml文件非常简单。

首先让我们在服务器上创建一个文件夹。目前为所有Saiku演示文件设置了一个文件夹 - 为简单起见,我们将使用这个文件夹:
cd~ / saiku-server / tomcat / webapps / saiku
mkdir supplierChain

在Eclipse中,右键单击Mondrian xml文件,选择出口:

接着选择General> File System ,然后单击Next

 

定义要从哪个项目导出的文件并定义目标文件夹:

并单击Finish(完成)。现在,您在本地服务器上有一份文件副本。

配置Saiku

按照此处所述配置数据源。如有必要,请按此处所述添加JDBC驱动程序。在我的例子中,这归结为以下(作为一个例子,我的数据库表驻留在我的本地MySQL数据库上,我创建了一个名为supplierChain.mondrian.xml的Mondrian模式):

cd ~/saiku-server/tomcat/webapps/saiku/WEB-INF/classes/saiku-datasources
cp foodmart supplierChain
vi supplierChain


将文件的内容更改为:

type = OLAP
name = supplierChain
driver = mondrian.olap4j.MondrianOlap4jDriver
location = jdbc:mondrian:Jdbc = jdbc:mysql:// localhost / datamart_demo; Catalog = .. / webapps / saiku / supplierChain / supplierChain.mondrian.xml; JdbcDrivers = com.mysql.jdbc.Driver;
username = root
password =

保存并关闭。

注意:在我的下载中,Saiku Server已经包含了MySQL JDBC jar,因此下一节只是概述,以防您需要添加任何其他驱动程序

接下来从这里下载JDBC MySQL驱动程序。

cd ~/saiku-server/tomcat/webapps/saiku/WEB-INF/lib/
cp ~/Downloads/mysql-connector-java-5.1.22/mysql-connector-java-5.1.18-bin.jar .

好,易于。

重新启动Saiku并检查您是否可以在Web界面中看到架构:

如果您遇到问题,请查看服务器日志:
vi~ / saiku-server / tomcat / logs / catalina.out
按SHIFT + G直接转到文件末尾,然后开始向上滚动并继续寻找人类可读的错误消息。注意新用户:会有很多神秘的线条...只是忽略它们......在某些时候你应该找到一些有意义的东西(如果有错误的话)。
或者如果你想继续观察日志:
tail -f~ / saiku-server / tomcat / logs / catalina.out
如果你的OLAP架构有问题,你应该在那里找到一些提示。

通过阅读博客可以找到哪些错误示例:我的新OLAP架构未显示在Web界面中,因此我分析了日志并找到以下行:

正如您所看到的,它在这里说“ 数据库中不存在” 表'dim_customers'。(在表中)(在第27行,第4列)“,这意味着我在XML文件中指定的表名必须是错误的。做一次双重检查我意识到,该表实际上名为dim_customer。所以我回到Eclipse,纠正这个错误,重新上传文件并再次刷新缓存...现在我的架构出现了。

如果您对Schema进行了更改并再次将其导出到服务器,则只需单击Web界面中的Refresh按钮即可刷新Saiku服务器现金:

现在我们可以完成检查的最后一部分:分析维度和度量是否按预期运行,并且我们已经在路上,我们还检查数据是否正确。我们通过在GUI中使用维度和度量来执行所有这些操作,并运行一些SQL查询来交叉检查结果:

如何在Saiku上启用Mondrian MDX和SQL日志记录

在某些测试场景中,您可能对Mondrian生成的SQL感兴趣。要启用此类日志记录,请在~saiku-server / tomcat / webapps / saiku / WEB-INF / classes中编辑log4j.xml 文件


取消注释专门针对Mondrian SQL语句的标题特殊日志文件正下方的最后一部分。如果要记录已提交的MDX语句,请取消注释上面的部分(专门针对Mondrian MDX语句的特殊日志文件)。保存文件。

然后重启服务器。

然后,您会发现在〜/赛酷服务器/ tomcat的/日志两个新的日志文件:
mondrian_sql.log
mondrian_mdx.log

例如,如果您在Saiku上使用花哨的MDX模式功能,它允许您编写和执行您自己的MDX查询,您可以通过在终端中运行此命令来遵循由Mondrian生成的SQL:
tail -f~saiku-服务器/ tomcat的/日志/ mondrian_sql.log

参考网站:http://diethardsteiner.blogspot.com/2013/01/mondrian-4-get-ready.html

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值