- PVSM.RU - https://www.pvsm.ru -

Организация OLAP куба средствами Python

Добрый день, уважаемые читатели.
Сегодня я расскажу вам о том, как можно построить простенькую систему анализа данных на Python. В этом мне помогут framework cubes [1] и пакет cubesviewer [2].
Сubes представляет собой framework'ом для работы с многомерными данными с помощью Python. Кроме того он включает в себя OLAP HTTP-сервер для упрощенной разработки приложений отчетности и общего просмотра данных.
Сubesviewer представляет собой web-интерфейс для работы с вышеуказанным сервером.

Установка и настройка cubes

Для начала надо установить библиотеки, необходимые для работы пакета:

pip install pytz python-dateutil jsonschema
pip install sqlalchemy flask

Далее устанавливаем сам пакет cubes:

pip install cubes

Как показала практика, лучше использовать версию (1.0alpha2) из текущего репозитория [3].

Доп настройки под windows

Если вы планируете работать под Windows необходимо в файле {PYTHON_DIR}Libsite-packagesdateutiltz.py заменить 40 строку:

return myfunc(*args, **kwargs).encode()

на

return myfunc(*args, **kwargs)

Затем, вне зависимости от платформы на которой вы работаете, нужно добавить следующий fix [4] для корректной работы json-парсера. Вносить его надо в {PYTHON_DIR}Libsite-packagescubes-1.0alpha-py2.7.eggcubesmetadata.py начиная с 90 строки:

elif len(parts.scheme) == 1 and os.path.isdir(source):
     # TODO: same hack as in _json_from_url
     return read_model_metadata_bundle(source)

Описание настройки куба и процесс его разворачивания

Для примера возьмем OLAP-куб, который идет в поставке с cubes. Он находится в папке examples/hello_world (ее можно взять с репозитория).
Наибольший интерес для нас представляют 2 файла:

  • slicer.ini — файл настроек http сервера нашего куба
  • model.json — файл с описание модели куба

Остановимся на них поподробнее. Начнем с файла slicer.ini, который может включать следующие разделы:

  • [workspace] – конфигурация рабочего места
  • [server] — параметры сервера (адрес, порт и тд.)
  • [models] — список моделей для загрузки
  • [datastore] или [store] – параметры хранилища данных
  • [translations] — настройки локализации для модели.

Итак разберем из нашего тестового файла видно, что сервер будет располагаться на локальной машине и будет работать по 5000 порту. В качестве хранилища будет использоваться локальная база SQLite под названием data.sqlite.
Подробнее о конфигурировании сервера можно прочитать [5] в документации.
Также из файла видно, что описание модели нашего куба находиться в файле model.json, описание структуры которого мы сейчас и займемся.
Файл описания модели, это json-файл, который включает следующие логические разделы:

  • name – имя модели
  • label – метка
  • description – описание модели
  • locale – локаль для модели (если задана локализация)
  • cubes – список метаданных кубов
  • dimensions – список метаданных измерений
  • public_dimensions – список доступных измерений. По умолчанию все измерения доступны.

Для нас представляют интерес разделы cubes и dimensions, т.к. все остальные опциональны.
Элемент списка dimensions, содержит следующие метаданные:

Ключ Описание
name идентификатор измерения
label Имя измерения видное пользователю
description описание измерения для пользователей
levels Список уровней измерений
hierarchies Список иерархий
default_hierarchy_name Идентификатор иерархии

Элемент списка cubes, содержит следующие метаданные:

Ключ Описание
name идентификатор измерения
label Имя измерения видное пользователю
description описание измерения для пользователей
dimensions список имен измерений заданных выше
measures список мер
aggregates список функций агрегации мер
mappings задание разметки логических и физических атрибутов

Исходя из выше описанного, можно понять, что у нас в модели в будет 2 измерения (item, year). У измерения "item" 3 уровня измерений:

  • category. Отображаемое имя «Category», поля «category», «category_label»
  • subcategory. Отображаемое имя «Sub-category», поля «subcategory», «subcategory_label»
  • line_item. Отображаемое имя «Line Item», поле «line_item»

В качестве меры в нашем кубе будет выступать поле «amount», для которой выполняются функции суммы и подсчета кол-ва строк.
Подробнее о разметке модели куба можно почитать в документации [6]
После того, как мы разобрались с настройками, надо создать нашу тестовую базу. Для того, чтобы это сделать, необходимо запустить скрипт prepare_data.py:

python prepare_data.py

Теперь осталось только запустить наш тестовый сервер с кубом, который называется slicer:

slicer serve slicer.ini

После этого можно проверить работоспособность нашего куба. Для этого в строке браузера можно ввести:
localhost [7]:5000/cube/irbd_balance/aggregate?drilldown=year
В ответ мы получим json-объект с результатом агрегации наших данных. Подробнее о формате ответа сервера можно почитать тут [8].

Установка cubesviewer

Когда мы настроили наш куб, можно приступить к установке сubesviewer. Для этого надо скопировать репозиторий [9] себе на диск:

git clone https://github.com/nonsleepr/cubesviewer.git

А потом просто переместить содержимое папки /src в нужный место.
Надо отметить, что сubesviewer является Django-приложением, поэтому для его работы необходим Django (не выше версии 1.4), а также пакеты requests и django-piston. Т.к. данная версия Django уже устарела, то выше я привел ссылку откуда можно взять сubesviewer для версии Django 1.6.
Установка ее немного отличается от оригинала тем, что в файл конфигурации сервера slicer.ini в раздел [server] нужно добавить строку allow_cors_origin: http://localhost:8000
После этого надо настроить [10] приложение в файле {CUBESVIEWER_DIR}/web/cvapp/settings.py. Указав ему настройки БД, адрес OLAP сервера (переменная CUBESVIEWER_CUBES_URL) и адрес просмоторщика (CUBESVIEWER_BACKEND_URL)
Осталось внести небольшой fix [11] в dajno-piston
Теперь можно синхронизировать наше приложение с БД. Для этого из {CUBESVIEWER_DIR}/web/cvapp нужно выполнить:

python manage.py syncdb

Осталось запустить локальный сервер Django

python manage.py runserver

Теперь осталось зайти на указанный в CUBESVIEWER_BACKEND_URL адрес через браузер. И наслаждаться готовым результатом.
Организация OLAP куба средствами Python

Заключение

Для иллюстрации работы я взял самый простой пример. Надо отметить что для производственных проектов cubes можно развернуть [12] например на apache [13] или uswgi [14]. Ну а подключить к нему сubesviewer с помощью этой статьи не составит труда.
Если тема будет интересна сообществу, то я раскрою ее в одной из будущих статей.

Автор:

Источник [15]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/news/59707

Ссылки в тексте:

[1] cubes: http://cubes.databrewery.org/

[2] cubesviewer: http://jjmontesl.github.io/cubesviewer/

[3] репозитория: https://github.com/Stiivi/cubes

[4] fix: https://github.com/rgruebel/cubes/commit/4fb6b8e1d85a99bc7bdd4f88697ca6731503eee6

[5] прочитать: http://pythonhosted.org/cubes/configuration.html

[6] документации: http://pythonhosted.org/cubes/model.html#introduction

[7] localhost: http://localhost

[8] тут: http://pythonhosted.org/cubes/server.html

[9] репозиторий: https://github.com/nonsleepr/cubesviewer

[10] настроить: https://github.com/jjmontesl/cubesviewer/blob/master/doc/guide/cubesviewer-gui-installation.md

[11] fix: https://bitbucket.org/spookylukey/django-piston/commits/40645e760ea2cb9a37d87c9352607b3fa7fac346#chg-piston/emitters.py

[12] развернуть: http://pythonhosted.org/cubes/deployment.html

[13] apache: http://httpd.apache.org/

[14] uswgi: http://uwsgi-docs.readthedocs.org/en/latest/

[15] Источник: http://habrahabr.ru/post/222421/