Как настроить размер Saiku в MySQL

В последнее время я пытаюсь использовать Сайку 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 как измерение, однако я не вижу примера того, как использовать собственный столбец таблицы в качестве измерения. Кажется, о Сайку не так много материала. Кто-нибудь может помочь по этой проблеме?

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 и по-прежнему использовать естественный ключ для объединений

Следуйте этому руководству, чтобы создать 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 - Кимбалл бы гордился

Используйте учебник, связанный с вариантом 2, но добавьте PK INTEGER PRIMARY KEY в качестве АВТОМАТИЧЕСКОГО УВЕЛИЧЕНИЯ. Запустите этот запрос сразу:

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
Другие вопросы по тегам