Объединение двух кубов в один на Pentaho

Mondrian позволяет объединять кубы по измерениям. В результате создается виртуальный куб по этим измерениям.
Нам надо разобраться с двумя вопросами:

  1. Как происходит объединение на уровне схемы?
  2. Как ведет себя куб при несовпадении измерений, и как ведет себя расчет мер? Это проще описать на примере: в магазине №1 30 декабря 1997 года была продажа товара “продукт 1” на 30 руб., а его себестоимость - 29 руб. - попала в нашу базу 31 декабря 1997. Каким образом в виртуальном кубе будет рассчитываться прибыль 30 и 31 декабря?

На практике объединение кубов происходит следующим образом. Прибыль 30 декабря по товару “продукт 1” составит 30 - 0 = 30, Прибыль 31 декабря по “продукту 1” будет 0 - 29 = - 29. Прибыль за 30 - 31 декабря - составит 30 - 29 = 1.

Схема куба

Начнем разбираться, как происходит объединение кубов на уровне схемы.

<Schema name="two_virtual_cube_test" description="two virtual cube">
<Dimension type="StandardDimension" visible="true" highCardinality="false" name="Store" description="Store name">
<Hierarchy name="Store" visible="true" hasAll="true" primaryKey="id_dim_store" description="Store">
  <Table name="dim_store" schema="test" />
  <Level name="Store" visible="true" column="store_name" type="String" uniqueMembers="false" levelType="Regular" hideMemberIf="Never" caption="Store name" description="Store" />
  </Hierarchy>
  </Dimension>
<Dimension type="TimeDimension" visible="true" highCardinality="false" name="Time">
<Hierarchy name="Time" visible="true" hasAll="true" primaryKey="id_dim_time">
  <Table name="dim_time" schema="test" />
  <Level name="Year" visible="true" column="year" type="String" uniqueMembers="false" levelType="TimeYears" hideMemberIf="Never" />
  <Level name="Month" visible="true" column="month" type="String" uniqueMembers="false" levelType="TimeMonths" hideMemberIf="Never" caption="Month" description="Month" />
  <Level name="Day" visible="true" column="day" type="String" uniqueMembers="false" levelType="TimeDays" hideMemberIf="Never" caption="Day" description="Day" />
  </Hierarchy>
  </Dimension>
<Cube name="sale_fact" caption="sale_fact" visible="true" description="sale_fact" cache="true" enabled="true">
  <Table name="fact_sale" schema="test" />
  <DimensionUsage source="Store" name="Store" visible="true" foreignKey="id_dim_store" highCardinality="false" />
  <DimensionUsage source="Time" name="Time" visible="true" foreignKey="id_dim_time" highCardinality="false" />
  <Measure name="Sum_sale" column="sum_sale" aggregator="sum" description="Sum sale" visible="true" />
  </Cube>
<Cube name="cost_sale" caption="cost_sale" visible="true" description="cost_sale" cache="true" enabled="true">
  <Table name="fact_cost" schema="test" />
  <DimensionUsage source="Store" name="Store" visible="true" foreignKey="id_dim_store" highCardinality="false" />
  <DimensionUsage source="Time" name="Time" caption="Time" visible="true" foreignKey="id_dim_time" highCardinality="false" />
  <Measure name="Sum_cost" column="sum_cost" aggregator="sum" description="Sum cost" visible="true" />
  </Cube>
<VirtualCube enabled="true" name="Profit" caption="Profit" description="Profit">
  <VirtualCubeDimension cubeName="sale_fact" caption="Time" name="Time" />
  <VirtualCubeDimension caption="Store" name="Store" />
  <VirtualCubeMeasure cubeName="sale_fact" name="[Measures].[Sum_sale]" visible="true" />
  <VirtualCubeMeasure cubeName="cost_sale" name="[Measures].[Sum_cost]" visible="true" />
  <CalculatedMember name="Profit" formatString="" caption="Profit" formula="[Measures].[Sum_sale] - [Measures].[Sum_cost]" dimension="Measures" visible="true" />
</VirtualCube>
</Schema>

Практически все мы с вами уже разбирали (см. урок рассмотрение OLAP куба в системе Pentaho). Осталось разобрать саму конструкцию VirtualCube. Поехали!

Объявление витруального куба

<VirtualCube enabled="true" name="Profit" caption="Profit" description="Profit">

 <VirtualCube>...</VirtualCube> описание представлено на языке xml, которое говорит, что мы будем в схеме использовать виртуальный куб. enabled="true" - куб будет доступен в системе и name="Profit" - имя куба. <CubeUsages> - это не обязательная конструкция, поэтому здесь её рассматривать не будем.

Добавление измерений в виртуальный куб

Измерения задаются тегом <VirtualCubeDimension>.

Начнем с <VirtualCubeDimension caption="Store" name="Store" />. Эта запись говорит о том, что объединение производится по внешнему измерению "Store", причем должно совпадать написание name в тегах VirtualCubeDimension и Dimension. Другими словами, "Store" в общем измерении должен быть написан так же, как и в VirtualCubeDimension.

Второй вариант - это: <VirtualCubeDimension cubeName="sale_fact" caption="Time" name="Time" />. Данная запись говорит о том, что происходит объединение измерения "Time", которое присутствует в кубе "sale_fact". Так как измерение name="Time" является внешним для куба "sale_fact", то весь тег <VirtualCubeDimension cubeName="sale_fact" caption="Time" name="Time" /> эквивалентен <VirtualCubeDimension caption="Time" name="Time" />.

Меры

Меры начинаются с тега <VirtualCubeMeasure>.

<VirtualCubeMeasure cubeName="sale_fact" name="[Measures].[Sum_sale]" visible="true" />

Теперь мы должны знать, из какого куба берется измерение. За это отвечает параметр cubeName. Мы из куба "sale_fact" должны взять измерение с именем name. Заметим, что имя должно задаться на языке MDX. Берем меру [Sum_sale] из куба sale_fact.

Дополнительно в кубе задаем вычисляемую меру.

<CalculatedMember name="Profit" formatString="" caption="Profit"  
formula="[Measures].[Sum_sale] - [Measures].[Sum_cost]" dimension="Measures" visible="true" />

Мы уже с вами это тоже рассматривали (см. урок рассмотрение OLAP куба в системе Pentaho).

Теперь можно приступать к практике. Предлагаю вам следующее видео (Практика объединения виртуальных кубов), где мы проверим поведение виртуального куба и заодно ознакомимся с инструментами PDI, schema-workbench и опубликуем куб на сервере.

Дополнение к уроку

Материалы к видео (Загрузка/Download)

План видео /Video plan (ссылка на youtub http://youtu.be/n34nrlBWCnc
Как сделать виртуальный куб в Pentaho Schema Workbench / How to do the virtual cube in the program Pentaho Schema Workbench
00:00 Введение / Introduction
01:21 Проверка наличия данных / Check of the data
02:03 ER схема БД / ER schema of the database
02:14 Добавление подключения / Add Connection
04:30 Добавление измерений /Adding dimensions
09:17 Добавление первого OLAP куба / Adding the first OLAP cube
12:05 Добавление второго OLAP куба / Adding the second OLAP cube
14:57 Создание виртуального OLAP куба /Create the virtual OLAP cube
16:23 Создание мер виртуального OLAP куба / Creating measures of the virtual OLAP cube
19:51 Публикация куба /The cube publication

Ссылки и литература:

  1. «Mondrian 3.0.4 Technical Guide».
  2. How to Design a Mondrian Schema (Выдержки из мануала по Mondrian) http://www-master.ufr-info-p6.jussieu.fr/2009/Ext/naacke/mondrian/doc/schema.html