BigObject

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 16:26, 30 января 2019.
BigObject
BigObject logo.png
Разработчики: ABC company
Выпущена: 2015
Постоянный выпуск: 1.8.2 / 09.11.2018
Операционная система: кросс-платформенная
Веб-сайт bigobject.io

BigObject – поставщик решений для интеллектуального анализа данных (Smart Data Analytics, SDA). BigObject использует технологию обработки данных "на месте" (In-Data Computing), которая позволяет производить вычисления в реальном времени, и предоставляет пользователю удобный интерфейс, упрощающий работу.

ABC Company

ABC Company – компания-поставщик различных сервисов. Её основными клиентами являются такие корпорации, как Coca Cola и Pepsi Cola, которые используют её сервисы для проведения маркетинговых исследований и анализа продаж на рынке. В середине 2015 года (разработка началась в начале 2014) компания ABC выпустила на рынок новый продукт – BigObject, который был призван облегчить управление и анализ баз данных в бизнесе.

О продукте BigObject

С появлением специального языка запросов для реляционных баз данных на рынке было представлено много вариантов как платного, так и бесплатного софта для работы с SQL (Structured Query Language). Интеллектуальный анализ больших баз данных становился всё более важным для развития бизнеса. BigObject - это программное решение, которое включает в себя не только все основные требования SQL, но и технологии для более сложной обработки данных, которые необходимы сегодняшним аналитикам. Особенность BigObject - это технология "вычисления-в-данных" (In-Data Computing). Сегодня большинство продуктов на рынке сначала вытаскивают большой объем данных с жёсткого диска в память и только потом применяют инструкции кода к этим данным. Революционная технология "вычисления-в-данных", представленная в BigObject, "проталкивает" код в пространство, где хранится база данных, тем самым, избегая постоянных обращений к жёсткому диску. В результате, по сравнению с другими решениями BigObject позволяет ускорить скорость обработки запросов, требуя меньших затрат на имеющееся оборудование.

Установка

BigObject упакован в docker-контейнер, который позволяет переносить или обновлять приложение в стандартизированном окружении, не зависящем от платформы, на которой работает пользователь. Перед тем как начать установку BigObject, необходимо проверить, установлен ли на компьютере Docker.

$ docker --version

Установка Docker

Шаг 1 – удаляем ранее установленные версии[Источник 1]

$ sudo apt-get remove docker docker-engine docker.io

Содержимое /var/lib/docker - останется неизменным. Сейчас пакет Docker CE называется docker-ce.

Шаги 2-6 нужны, чтобы настроить репозиторий Docker-а при первичной установке Docker CE. После них можно будет устанавливать и обновлять Docker из этого репозитория.

Шаг 2 – Обновление локального индекса пакетов (обновление базы данных доступных пакетов из репозиториев, определенных в файле /etc/apt/sources.list и каталоге /etc/apt/sources.list.d)

$ sudo apt-get update

Шаг 3 – установка пакетов, позволяющих работать с HTTPS

$ sudo apt-get install \
    apt-tranport-https \
    ca-certificates \
    curl \
    software-properties-common\

Шаг 4 – вводим официальный dpg-ключ

$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
OK

Шаг 5 – удостоверяемся, что пакет подлинный

$ sudo apt-key fingerprint 0EBFCD88
pub   4096R/0EBFCD88 2017-02-22
      Key fingerprint = 9DC8 5822 9FC7 DD38 854A  E2D8 8D81 803C 0EBF CD88
uid                  Docker Release (CE deb) <docker@docker.com>
sub   4096R/F273FCD8 2017-02-22

Шаг 6 – настройка репозитория

$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

Шаг 7 – непосредственная установка Docker CE

$ sudo apt-get update
$ sudo apt-get install docker-ce

Если возникла проблема "...Depends: libseccomp2...", её можно решить с помощью следующих команд:

$ sudo add-apt-repository ppa:ubuntu-sdk-team/ppa
$ sudo apt-get update
$ sudo apt-get install libseccomp2

После этого, снова возвращаемся к Шагу 7.

Шаг 8 – проверка корректной установки Docker CE

$ sudo docker run hello-world
...
Hello from Docker!
This message shows that your installation appears to be working correctly.
...
$ docker --version
Docker version 18.09.0-ce-beta1, build 78a6bdb

После того как Docker установлен, пользователь может приступить к установке BigObject.

Установка BigObject

Шаг 1 – скачиваем демо-версию образа BigObject для Docker [Источник 2]

$ sudo docker pull bigobject/bigobject:demo
demo: Pulling from bigobject/bigobject
...
Status: Downloaded newer image for bigobject/bigobject:demo

Шаг 2 – создаем и запускаем Docker-контейнер (с демонстрационными данными или реальными данными пользователя)

$ sudo docker run -t -d --name BigObject -p 9090:9090 bigobject/bigobject:demo
aff7b73da3bcd3f4fbe389b0cc8e269b9e57236a59668f64c43d7ed37e9cb540

Шаг 3 – открываем браузер Для Linux-платформ нужно открыть адрес http://127.0.0.1:9090 или http://localhost:9090.

Шаг 4 – переходим во вкладку BigObject shell (см. Рисунок 1), чтобы начать исследование приложения.

Рисунок 1 – Стартовая страница для работы с BigObject

Импорт данных

Порт Описание
9090 Синхронные/асинхронные HTTP запросы (REST API)
9091 Ввод данных в формате .csv или avro
3306 Клиент-серверный протокол MySQL

Базовое управление

BigObject поддерживает собственный SQL-like язык. В данном разделе будут описаны типы данных и табличные объекты, с которыми работает BigObject. Также, будут описаны команды, с помощью которых можно создать базу данных и послать в неё базовые запросы.

Табличный объект и Типы данных

Архитектура BigObject позволяет анализировать многомерные данные по схеме звезды или снежинки. Многомерные данные организованы в виде двух таблиц: таблица элементов (dimensional table) и таблица фактов (fact table).

Таблица элементов (dimensional table)

Элемент состоит из набора особых качеств, называемых атрибутами. Примером многомерных данных могут служить какие-либо бизнес данные. Они могут включать в себя такую информацию, как название продуктов, поставщиков, цену. Если эту информацию организовать специальным образом и сохранить в таблице, она будет объектом в таблице элементов BigObject.

Приведем другой пример. Компания ABC начинает свой бизнес, поэтому ей необходимо организовать базы данных для дальнейшей аналитики. Первое, что может прийти в голову – это создание базы данных с информацией об уже имеющихся клиентах компании. Тогда, таблица элементов с названием "Customer", может выглядеть следущим образом:

ID Name Language State Company Gender Age
4 Джулия Кеннеди Итальянский Флорида Fivespan Женский 30

Чтобы сослаться на атрибут a в таблице элементов D, пользователь должен написать D.a. Например, Customer.Gender – это значение столбца Gender в таблице элементов Customer.

Таблица фактов

Рисунок 2 – Пример заполнения таблицы sales

Факт – данные, которые необходимо проанализировать.

Когда аналитики компании ABC создают базу данных, им, например, может понадобиться сохранить в отдельную таблицу историю проводимых денежных транзакций (для последующего анализа). Так, заполнение таблицы фактов, названной "sales", может быть аналогично примеру на Рисунке 2.

Колонки Customer.id и Product.id ссылаются на колонку id в таблицах Customer и Product, соответственно.

Типы данных

BigObject поддерживает следующие типы данных:

Тип Описание
STRING Строка, заканчивающаяся на символ NULL(0)
CHAR Строка константной длины
VARSTRING Строка переменной длины
BYTE Один символ (32-126 в ASCII)
INT8 64-битное целое число
INT16 16-битное целое число
INT32 32-битное целое число
INT64 64-битное целое число
FLOAT ТЧисло с плавающей точкой (4 байта)
DOUBLE Двоичное представление числа с плавающей точкой (8 байт)
DATE32 Год, месяц, число (4 байта)
DATETIMEDOS Дата и время (4 байта)
DATETIME32 Дата и время (4 байта)
DATETIME64 Дата и время (8 байт)
IPv4 IPv4
IPv6 IPv6

Дефолтное и максимальное значения длин строк заданы в следующей таблице:

Тип длина по дефолту максимальная длина
STRING 63 1023
CHAR 32 8000
VARSTRING 255 65535

Базовые команды

CREATE

CREATE TABLE table_name (column1 data-type, [column2 data-type], ...)

Чтобы, как в примере выше создать таблицу, ссылающуюся на столбцы других таблиц, нужно использовать уникальный ключ - KEY(column1...).

1 CREATE TABLE Product ('id' INT32, 'name' STRING(63), 'brand' STRING(63), 'brandOwner' STRING(63), 'weightGrams' FLOAT, 'weightOunce' FLOAT, 'category' STRING(63), 'price' FLOAT, 'cost' FLOAT, 'profit' FLOAT, KEY (id))
2 
3 CREATE TABLE Customer ('id' INT32, 'name' STRING, 'language' STRING, 'state' STRING, 'company' STRING, 'gender' STRING, 'age' INT32, KEY (id))
4 
5 CREATE TABLE sales ('order_id' INT32, 'Customer.id' INT32, 'Product.id' INT32, 'channel_name' STRING, 'Date' DATETIME32, 'qty' INT64, 'total_price' DOUBLE)

Подробнее про создание таблиц можно прочитать в оригинальной документации. [Источник 3]

INSERT

Синтаксис команды вставки данных в таблицу:

INSERT INTO table_name VALUES (value1, value2, ...)

Вставка данных в таблицы из предыдущих примеров:

1 INSERT INTO Product VALUES ('2','Throwback Cola', 'Pepsi', 'Pepsico','0', '0', 'soda', '12.01', '3.11', '8.9')  
2 
3 INSERT INTO Customer VALUES ('4', 'Julia Kennedy', 'Italian', 'Florida', 'Fivespan', 'Female', '30')
4 
5 INSERT INTO sales VALUES ('8713', '366', 'CVS', '2013-01-01 00:06:30', '6', '77.94'), ('8713', '3263','7-11', '2013-01-01 00:09:52', '2', '19.94')

Другие команды

Про остальные команды (LOAD, UPDATE, SELECT, TRIM, DROP, DELETE, ALTER, RENAME) и их дополнительные атрибуты подробно можно прочитать в оригинальной документации. [Источник 4] Также, там дано сравнение описанных выше команд с командами MySQL и приведены специальные запросы, доступные администратору БД.

Визуализация данных

Рисунок 3 – Список доступных диаграмм

BigObject использует библиотеку D3.js и ее средства для визуализации. Для веб-разработчиков необходимым является наличие установленных модулей: D3.js, C3.js, JQuery. Также, BigObject поддерживает некоторые плагины, которые базируются на той же библиотеке D3.js.

После выполнения запроса к базе данных, пользователь может перейти во вкладку CHART и использовать выпадающее меню (см. Рисунок 3), в котором он может выбрать тип диаграммы, которая визуализирует результат.

Доступно много видов диаграмм: круговая, граф корреляции, гистограмма, графики и др.

In-Data Programming

Программирование "в данных" – это механизм, реализованный в BigObject, претворяющий в жизнь идею "исполнения кода, выполняющегося там же, где находятся данные". Сейчас он поддерживает язык программирования Lua.

Определённые пользователем функции вызываются в телах запросов FIND, APPLY или SELECT, чтобы обрабатывать данные в древовидной(Tree Proramming [Источник 5]) или табличной(Table Programming [Источник 6]) структуре.

Рассмотрим небольшой пример выполнения серии операций над данными в теле запроса APPLY.

APPLY run_total('sales', 'qty', 'qty_rt')

Этот запрос исполняет функцию run_total(), чтобы открыть таблицу sales, вычислить общую сумму для колонки qty и сохранить результаты в колонку qty_rt. Листинг функции run_total() приведен ниже.

1 function run_total(bt, col, rt_col)
2      t = bo.getTable(bt)
3      rt = t:getColumnValue(col);
4      for i = 2, #rt do
5            rt[i] = rt[i] + rt[i-1]
6      end
7      t:setColumnValue(rt_col, rt)
8 end

Примеры пользовательской аналитики

Продажи в определенные сроки

Цель представленной аналитики – сузить круг анализируемых данных до определенного периода.

Совокупные продажи в месяц

Пользователь рассчитал совокупные продажи каждого месяца в году. Он разделил годы работы на объекты year(Date) и месяцы на объекты month(Date), а затем просуммировал значения.

FIND year(Date), month(Date), sum(total_price) FROM sales

Результаты работы пользователя представлены в таблице продаж на Рисунке 4. На Рисунке 5 приведена построенная по вычисленным значениям столбчатая диаграмма.

Рисунок 4 – Таблица продаж
Рисунок 5 – Продажи в 2013 году

Продажи в месяц на различных платформах

Чтобы анализировать продажи на различных платформах, пользователь добавил в текст запроса атрибут channel_name.

FIND month(Date), channel_name, sum(total_price) FROM sales

Результаты работы представлены на Рисунке 6 и Рисунке 7.

Рисунок 6 – Таблица продаж на разл. платформах
Рисунок 7 – Продажи в 2013 году

Поиск продуктов, приносящих наибольшую прибыль

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

Пользователь выделил в отдельную таблицу продукты, принесшие наибольшую прибыль:

BUILD TABLE high_profit_product AS (FIND TOP 100 Product.name FROM sales {sortby: Product.profit})

Дальнейший анализ проводится на подмножестве, учитывающем дополнительный фильтр в виде high_profit_product.

FIND TOP 100 Product.name, sum(total_price) FROM sales, high_profit_product

В результате, пользователь может увидеть следующее графическое представление результатов проведенного анализа (см. Рисунок 8):

Рисунок 8 – Самые прибыльные продукты

Пример работы

Для работы с базой через его HTTP API удобно писать свои скрипты, облегчающие процесс создания HTTP-запросов и обработку ответов. Для примера стоит рассмотреть работу со следующим проектом.

Подготовка к работе

$ git clone https://github.com/Alex-Kuz/bigobject-helper
$ cd bigobject-helper

В репозитории могут присутствовать большие файлы (для примеров и тестирования), поэтому клонирование проекта может занять до нескольких минут.

Запуск сервера

Для запуска сервера достаточно загрузить образ docker-контейнера (это операция достаточно долгая и требовательная к доступному трафику) и запустить его. Это легко сделать с помощью команд в Makefile:

  • make docker - загрузка образа docker-контейнера
  • make run - запуск сервера BigObject
  • make stop - остановка сервера
  • make logs - вывод логов сервера (только при запущенном docker-контейнере)
  • make inside - открытие терминала контейнера

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

$ make docker && make run

После этой комманды контейнер будет загружен и запущен. Можно запустить несколько контейнеров, переопределив их на разные порты (по умлочанию 9090). Для проверки работы сервера можно перейти на http://127.0.0.1:9090.

Загрузка таблицы

Основная проблема текущей версии (BigObject Analytics Release 1.8.2 (Nov, 09, 2018)) - это несоответствие документации и работы с HTTP API на практике. При работе с API через POST, GET и PUT запросы требуется получить 2 значения - session_id и token. Однако с этой парой можно провести только одно изменение базы данных. Пусть имеется файл с данными в формате csv, тогда процесс добавления этих данных в таблицу сводится к следующему алгоритму:

  1. Создать таблицу с необходимыми полями
  2. Загрузить файл, название которого совпадает с названием таблицы.

Для создания таблицы требудется послать GET-запрос, в теле которого будет описание таблицы и ее колонок в формате json. Это довольно неудобно делать вручную, особенно для больших и широких таблиц. Поэтому перед созданием таблицы можно сразу загрузить файл в базу данных следующим POST-запросом:

$ curl -v -F 'file=@./data.csv;type=text/csv' http://127.0.0.1/import/1qazWSF45?token=123cdksjd

При успешном добавлении в теле ответа будет необходимое описание в формате json, причем BigObject сама вычислит необходимые типы колонок по вашим данным. После этого можно создать таблицу, что приведет к потере на сервере уже загруженного файла. Имеет смысл воспользоваться уже готовым скриптом, который выполняет необходимые действия, применяя описанный обходной путь. Рассмотрим пример вставки данных из директории data в проекте (сам файл был взят из репозитория открытых курсов по машинному обучению):

$ ./push_csv ./data/StrongPasswordData.csv 127.0.0.1:9090
*   Trying 127.0.0.1...
* Connected to 127.0.0.1 (127.0.0.1) port 9090 (#0)
> POST /import/cfd77ec9ef42b896?token=ab54b488 HTTP/1.1
> Host: 127.0.0.1:9090
> User-Agent: curl/7.47.0
> Accept: */*
> Content-Length: 483
> Expect: 100-continue
> Content-Type: multipart/form-data; boundary=------------------------e9505278bd1d68c2
> 
< HTTP/1.1 100 Continue
< HTTP/1.1 200 OK
< Date: Wed, 23 Jan 2019 16:12:22 GMT
< Content-Length: 0
< Content-Type: text/plain; charset=utf-8
< 
* Connection #0 to host 127.0.0.1 left intact
*   Trying 127.0.0.1...
* Connected to 127.0.0.1 (127.0.0.1) port 9090 (#0)
> POST /import/460d7ab5b825223a?token=08c190a2 HTTP/1.1
> Host: 127.0.0.1:9090
> User-Agent: curl/7.47.0
> Accept: */*
> Content-Length: 4670133
> Expect: 100-continue
> Content-Type: multipart/form-data; boundary=------------------------2f69a4c5f8769f27
> 
< HTTP/1.1 100 Continue
< HTTP/1.1 200 OK
< Date: Wed, 23 Jan 2019 16:12:22 GMT
< Content-Length: 0
< Content-Type: text/plain; charset=utf-8
< 
* Connection #0 to host 127.0.0.1 left intact
{u'name': u'StrongPasswordData', u'columns': [{u'type': u'STRING', u'attr': u'subject'}, {u'type': u'INT32', u'attr': u'sessionIndex'}, {u'type': u'INT32', u'attr': u'rep'}, {u'type': u'FLOAT', u'attr': u'H.period'}, {u'type': u'FLOAT', u'attr': u'DD.period.t'}, {u'type': u'FLOAT', u'attr': u'UD.period.t'}, {u'type': u'FLOAT', u'attr': u'H.t'}, {u'type': u'FLOAT', u'attr': u'DD.t.i'}, {u'type': u'FLOAT', u'attr': u'UD.t.i'}, {u'type': u'FLOAT', u'attr': u'H.i'}, {u'type': u'FLOAT', u'attr': u'DD.i.e'}, {u'type': u'FLOAT', u'attr': u'UD.i.e'}, {u'type': u'FLOAT', u'attr': u'H.e'}, {u'type': u'FLOAT', u'attr': u'DD.e.five'}, {u'type': u'FLOAT', u'attr': u'UD.e.five'}, {u'type': u'FLOAT', u'attr': u'H.five'}, {u'type': u'FLOAT', u'attr': u'DD.five.Shift.r'}, {u'type': u'FLOAT', u'attr': u'UD.five.Shift.r'}, {u'type': u'FLOAT', u'attr': u'H.Shift.r'}, {u'type': u'FLOAT', u'attr': u'DD.Shift.r.o'}, {u'type': u'FLOAT', u'attr': u'UD.Shift.r.o'}, {u'type': u'FLOAT', u'attr': u'H.o'}, {u'type': u'FLOAT', u'attr': u'DD.o.a'}, {u'type': u'FLOAT', u'attr': u'UD.o.a'}, {u'type': u'FLOAT', u'attr': u'H.a'}, {u'type': u'FLOAT', u'attr': u'DD.a.n'}, {u'type': u'FLOAT', u'attr': u'UD.a.n'}, {u'type': u'FLOAT', u'attr': u'H.n'}, {u'type': u'FLOAT', u'attr': u'DD.n.l'}, {u'type': u'FLOAT', u'attr': u'UD.n.l'}, {u'type': u'FLOAT', u'attr': u'H.l'}, {u'type': u'FLOAT', u'attr': u'DD.l.Return'}, {u'type': u'FLOAT', u'attr': u'UD.l.Return'}, {u'type': u'FLOAT', u'attr': u'H.Return'}]}

В выводе скрипта можно увидеть описание таблицы в формате json, где можно увидеть имя созданной таблицы - StrongPasswordData. На рисунке 9 видно, что создание новой таблицы в базе данных прошло успешно:

Рисунок 9 – Обновленный список таблиц после вставки StrongPasswordData

На рисунке 10 показан результат запроса количества записей в таблице (совпадает с числом записей в исходном файле). На рисунке 11 видно, что таблица зполнена данными и не является пустой (могло быть иначе, если действовать согласно документации во вкладках Documentation->HTTP Interfaces->Data Import API).

Рисунок 10 –Количество записей в StrongPasswordData
Рисунок 11 – Небольшая выборка записей StrongPasswordData

Оптимизация

Описанный эксперимент проводится на ноутбуке со следующими характеристиками:

  • Процессор Core i7-7500U
  • Оперативная память - 8 ГБ (контейнеру доступен 1 Гб)
  • Один модуль m.2 емкостью 256 ГБ (протокол SATA Rev.3)

Понимание условий эксперимента необходимо, чтобы правильно оценить возможности производительности BigObject. Для оптимизации базы данных (то есть операций, сокращающих время обработки большиинства запросов) в BigObject есть несколько инструментов, которые представляют собой SQL-запросы специальных видов. Описание этих способов есть во вкладках:

  1. Documentation->Basic Data Management->OPTIMIZE
  2. Documentation->Basic Data Management->Admin

В первой вкладке показан пример 1 запроса, который переиспользует память из-под удаленных строк таблицы, оптимизируя тем самым работу с памятью, практически не ускоряя обработку запросов.

OPTIMIZE TABLE table_name

В случае работы с новой таблицей, загруженной из уже готового файла, данная процедура не требуется.

Во втором разделе указаны различные запросы администрирования СУБД, однако для оптимизации существует запросы:

SET BOOST_LEVEL 1 -- Adjust to high performance and less memory usage when the expected query result set is small
SET BOOST_LEVEL 2 -- Adjust to high performance and moderate memory usage when the expected query result set contains millions of records
SET BOOST_LEVEL 3 -- Adjust to best performance and maximum memory usage when the expected query result set is large

На рисунке 12 показан запрос (пусть уровень оптимизации будет максимальный) и ответ:

Рисунок 12 – Установка уровня оптимизации

После установки максимального уровня оптимизации можно заметить, что следующий запрос выполняется в среднем за 8-9 секунд:

select * from StrongPasswordData

Измерения времени обработки запросов (каждый запрос был выполнен по 10 раз, время округлено до целого в меньшую сторону, среднеквадратическое отклонение времени выполнения каждого запроса была не меньше 3 секунд) :

select * from StrongPasswordData order by 'H.period', 'H.t' -- в среднем 15 секунд
select * from StrongPasswordData order by 'H.period', 'subject' -- в среднем 21 секунда
select * from StrongPasswordData order by 'subject',  'H.period', 'UD.five.Shift.r' -- в среднем 24 секунды

У администратора данной СУБД нет возможности создать необходимый ему индекс, который бы ускорил требуемые запросы, однако СУБД сама решает вопросы оптимизации, что и видно по предоставленным данным.

Визуализация

В уже вставленной таблице выполним запрос для оценки распределения суммарного параметра H.period для каждого субъекта:

select  subject, sum('H.period') as h_period_sum from StrongPasswordData group by subject order by h_period_sum

На рисунке 13 приведен результат обработки запроса и визуализации ответа.

Рисунок 13 – Визуализация суммы H.period для каждого субъекта

Первичный анализ данных

Подготовим новую таблицу:

$ ./push_csv ./data/video_games_sales.csv 
*   Trying 127.0.0.1...
* Connected to 127.0.0.1 (127.0.0.1) port 9090 (#0)
> POST /import/59b55b846f14ac4e?token=026ca3c6 HTTP/1.1
> Host: 127.0.0.1:9090
> User-Agent: curl/7.47.0
> Accept: */*
> Content-Length: 449
> Expect: 100-continue
> Content-Type: multipart/form-data; boundary=------------------------dcdc5aa06dbd4f7b
> 
< HTTP/1.1 100 Continue
< HTTP/1.1 200 OK
< Date: Wed, 29 Jan 2019 08:18:56 GMT
< Content-Length: 0
< Content-Type: text/plain; charset=utf-8
< 
* Connection #0 to host 127.0.0.1 left intact
*   Trying 127.0.0.1...
* Connected to 127.0.0.1 (127.0.0.1) port 9090 (#0)
> POST /import/524a8b3f97448d4c?token=e60387f9 HTTP/1.1
> Host: 127.0.0.1:9090
> User-Agent: curl/7.47.0
> Accept: */*
> Content-Length: 1618073
> Expect: 100-continue
> Content-Type: multipart/form-data; boundary=------------------------78bc19b0054f2099
> 
< HTTP/1.1 100 Continue
< HTTP/1.1 200 OK
< Date: Wed, 29 Jan 2019 08:18:57 GMT
< Content-Length: 0
< Content-Type: text/plain; charset=utf-8
< 
* Connection #0 to host 127.0.0.1 left intact
{u'name': u'video_games_sales', u'columns': [{u'type': u'STRING', u'attr': u'Name'}, {u'type': u'STRING', u'attr': u'Platform'}, {u'type': u'INT32', u'attr': u'Year_of_Release'}, {u'type': u'STRING', u'attr': u'Genre'}, {u'type': u'STRING', u'attr': u'Publisher'}, {u'type': u'FLOAT', u'attr': u'NA_Sales'}, {u'type': u'FLOAT', u'attr': u'EU_Sales'}, {u'type': u'FLOAT', u'attr': u'JP_Sales'}, {u'type': u'FLOAT', u'attr': u'Other_Sales'}, {u'type': u'FLOAT', u'attr': u'Global_Sales'}, {u'type': u'INT32', u'attr': u'Critic_Score'}, {u'type': u'INT32', u'attr': u'Critic_Count'}, {u'type': u'INT32', u'attr': u'User_Score'}, {u'type': u'INT32', u'attr': u'User_Count'}, {u'type': u'STRING', u'attr': u'Developer'}, {u'type': u'STRING', u'attr': u'Rating'}]}

В поле ввода веб-страницы BigObject (localhost:9090) вставим запрос для выборки оценок критиков и игроков для дальнейшего выявления корреляции этих параметров.

select Critic_Score, User_Score from video_games_sales
Рисунок 14 - Граф корреляции

Результат операции визуализируем с помощью инструмента CHART->correlation graph (рисунок 14). По рисунку видно, что никакой информации данная визуализация не предоставляет. Единственное, что можно сделать с этим результатом - с помощью курсора двигать красный прямоугольник (на рисунке он подписан числом 76, так как 76 - первая оценка критиков к результате выборки, если выполнить сортуровку в запросе, то в красном прямоугольнике будет 0). Выполним тот же запрос, но с сортировкой по обоим полям и построим гистограмму (рисунок 15). Как видно из рисунка 15, гистограмма тоже не дает даже оценочного представления о корреляции изучаемых параметров. Можно сделать вывод, что дальнейший анализ данных не имеет смысла. Гораздо проще воспользоваться другими иснтрументами, например библиотеками pandas и matplotlib для языка программирования python, где первая библиотека упрощает анализ данных, а вторая реализует визуализацию результатов.

Рисунок 15 - Гистограмма распределения оценок

Источники

  1. About Docker CE // Docker Docs. [2018—2018]. URL: https://docs.docker.com/install/ (дата обращения: 15.09.2018).
  2. Setup // Docs BigObject. [2018 — 2018]. Дата обновления: 09.11.2018. URL: http://docs.bigobject.io/Setup/index.html (дата обращения: 29.12.2018).
  3. CREATE statement // Docs BigObject. [2018 — 2018]. Дата обновления: 09.11.2018. URL: http://docs.bigobject.io/Basic_Data_Management/CREATE.html (дата обращения: 29.12.2018).
  4. Basic Data Management // Docs BigObject. [2018 — 2018]. Дата обновления: 09.11.2018. URL: http://docs.bigobject.io/Basic_Data_Management/index.html (дата обращения: 29.12.2018).
  5. Tree Programming // Docs BigObject. [2018 — 2018]. Дата обновления: 09.11.2018. URL: http://docs.bigobject.io/In-Data_Programming/Tree_Programming.html (дата обращения: 29.12.2018).
  6. Table Programming // Docs BigObject. [2018 — 2018]. Дата обновления: 09.11.2018. URL: http://docs.bigobject.io/In-Data_Programming/Table_Programming.html (дата обращения: 29.12.2018).