{"id":14277,"url":"\/distributions\/14277\/click?bit=1&hash=17ce698c744183890278e5e72fb5473eaa8dd0a28fac1d357bd91d8537b18c22","title":"\u041e\u0446\u0438\u0444\u0440\u043e\u0432\u0430\u0442\u044c \u043b\u0438\u0442\u0440\u044b \u0431\u0435\u043d\u0437\u0438\u043d\u0430 \u0438\u043b\u0438 \u0437\u043e\u043b\u043e\u0442\u044b\u0435 \u0443\u043a\u0440\u0430\u0448\u0435\u043d\u0438\u044f","buttonText":"\u041a\u0430\u043a?","imageUuid":"771ad34a-9f50-5b0b-bc84-204d36a20025"}

Инкрементальная загрузка в Qlik Sense

Часто приходится иметь дело с данными, представляющими из себя таблицы в миллионы строк. Более того, в эти таблицы могут добавляться тысячи или миллионы строк ежедневно или ежемесячно. При этом, для анализа выявления тенденций и аномалий бывает необходимым использовать и исторические данные. Для тех, кто использует для анализа и визуализации Qlik Sense, загрузка больших объемов занимает много времени.

Такой была задача построить на Qlik Sense аналитический отчет по продажам сотрудников, позволяющий ежемесячно отслеживать изменения клиентских потребностей. В месяц в мотивацию сотрудников входит порядка 15 млн операций. За 10 минут в Qlik Sense загружается около 8 млн строк.

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

Спасла инкрементальная загрузка. Из источников загружались только новые или измененные записи, а не все имеющиеся.

Инкрементальная загрузка - это механизм в Qlik Sense, с помощью которого из внешнего источника загружаются только обновленные данные, а основная масса неизменившихся данных загружается из внутреннего хранилища. Реализован механизм посредством файлов QVD.

QVD (Qlik View Data) – это формат файла, в котором содержится таблица данных, экспортируемая из программ Qlik View или Qlik Sense, и который может быть прочитан только этими программами. Этот формат оптимизирован для скорости при чтении данных из скрипта Qlik Sense, при этом не занимает много места и чтение данных из него в 10-100 раз быстрее, чем из других источников данных.

Инкрементальная загрузка имеет несколько вариантов:

· только добавление;

· добавление и обновление;

· добавление, обновление и удаление.

Рассмотрим самый простой вариант- добавление данных.

Наша задача - загрузить в Qlik Sense для анализа таблицу из ~80 млн строк и в дальнейшем ежемесячно пополнять её на ~15 млн строк.

Прежде чем начинать использовать метод инкрементальной загрузки, нужно в первый раз загрузить все данные из исходной таблицы. Загруженные данные необходимо сохранить в QVD.

Первичная загрузка данных в QVD

1. Запустите Qlik Sense и создайте новое приложение.

2. Откройте редактор скрипта загрузки данных.

3. Создайте раздел Загрузка таблицы первоначальная.

4. Столкнулась с тем, что при загрузке первоначальных данных с удаленного ресурса (в моем случае - из таблицы в БД MS SQL), возникает ошибка. Поэтому рекомендую выгрузить в таблицу в excel TOP 1000 строк из загружаемой таблицы и воспользоваться ею для создания первоначального QVD файла.

5. Загрузите все данные из файла Operation.xlsx

6. Добавьте строку сохранения данных в QVD файл. Cкрипт для загрузки на листе Загрузка таблицы первоначальная будет выглядеть так:

Operation: LOAD DATE_REPORT, DATE_REPORT_SRC, DATE_MONTH, client_tid, EMPLOYEE_LOGIN, EMPLOYEE_FIO, EMPLOYEE_ID, EMPLOYEE_POSITION, EMPLOYEE_POSITION_GR, - - - - - - - - - - - - - - - - - - - - DATE_UPDATE, PAYMENT_STATUS, in_sup, epk_id, PROD_KPI, IS_SBOLPRO FROM [lib://AttachedFiles/Operation.xlsx] (ooxml, embedded labels, table is Operation); STORE Operation INTO [lib://AttachedFiles/operation.qvd];

7. Загрузите данные.

8. Закомментируйте скрипт раздела Загрузка таблицы первоначальная.

9. Создайте раздел Проверка QVD

10. Создайте скрипт загрузки данных из QVD

LOAD DATE_REPORT, DATE_REPORT_SRC, DATE_MONTH, client_tid, EMPLOYEE_LOGIN, EMPLOYEE_FIO, EMPLOYEE_ID, EMPLOYEE_POSITION, EMPLOYEE_POSITION_GR, - - - - - - - - - - - - - - - - - - - - - - - - - - - - DATE_UPDATE, PAYMENT_STATUS, in_sup, epk_id, PROD_KPI, IS_SBOLPRO FROM [lib://AttachedFiles/operation.qvd] (qvd);

11. Запустите скрипт. Убедитесь, что данные из QVD загружаются в оптимизированном режиме. Просмотрите модель данных, проверьте, что данные загружены.

12. Создайте новый раздел - Добавление данных в таблицу.

13. Для объединения новых загруженных данных с содержимым QVD-файла соединяем их со старыми данными, а затем снова сохраняем их в QVD. Новые данные можем брать уже из необходимого нам источника.

LIB CONNECT TO 'SERVER'; Operation: LOAD DATE_REPORT, DATE_REPORT_SRC, DATE_MONTH, client_tid, EMPLOYEE_LOGIN, EMPLOYEE_FIO, EMPLOYEE_ID, EMPLOYEE_POSITION, EMPLOYEE_POSITION_GR, - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - DATE_UPDATE, PAYMENT_STATUS, in_sup, epk_id, PROD_KPI, IS_SBOLPRO; [Operation]: SELECT "DATE_REPORT", "DATE_REPORT_SRC", "DATE_MONTH", "client_tid", "EMPLOYEE_LOGIN", "EMPLOYEE_FIO", "EMPLOYEE_ID", "EMPLOYEE_POSITION", "EMPLOYEE_POSITION_GR", - - - - - - - - - - - - - - - - - - - - - - - - - - - - - "DATE_UPDATE", "PAYMENT_STATUS", "in_sup", "epk_id", "PROD_KPI", "IS_SBOLPRO" FROM "BD_DM".shema1."table_motivation" where date_month='2021.07.31'; Concatenate LOAD DATE_REPORT, DATE_REPORT_SRC, DATE_MONTH, client_tid, EMPLOYEE_LOGIN, EMPLOYEE_FIO, EMPLOYEE_ID, EMPLOYEE_POSITION, EMPLOYEE_POSITION_GR, - - - - - - - - - - - - - - - - - - - - - - - - - - PAYMENT_STATUS, in_sup, epk_id, PROD_KPI, IS_SBOLPRO FROM [lib://AttachedFiles/operation.qvd](qvd); STORE Operation INTO [lib://AttachedFiles/operation.qvd];

14. Сохраните изменения и запустите перезагрузку скрипта.

15. Новые данные загружаются в обычном режиме, а старые данные из QVD загружаются в оптимизированном режиме.

16. Просмотрите модель данных. Убедитесь, что данные в таблицу добавлены.

Таким образом, я по частям загрузила 6 месяцев данных об операциях. На сегодня в таблицу загружено более 81 млн строк.

Планирую в дальнейшем ежемесячно пополнять данные в приложении Qlik Sense на 13-15 млн строк, не ожидая загрузки данных часами и не рискуя при этом создать огромную нагрузку на сервер.

0
6 комментариев
Написать комментарий...
Сэм

Здравствуйте!Вы пропустили описание LIB CONNECT TO 'SERVER' и FROM "BD_DM".shema1."table_motivation"where date_month='2021.07.31';Могли бы добавить и их описание в Вашу инструкциюЗаранее благодарю

Ответить
Развернуть ветку
NTA
Автор

Добрый день! Благодарю за проявленный интерес и поясняю значение операторов.
Оператор LIB CONNECT TO использует для подключения к базе данных сохраненное подключение, созданное в редакторе загрузки данных. В связи разграничением прав доступа, не всегда у пользователя может быть возможность создать новое подключение.
В данном примере загружается таблица “table_motivation” из подключения ‘SERVER’ в личное пространство пользователя.
Предложенная последовательность действий:
1. Выберем из списка подключений источник, на котором хранится интересующая нас таблица (‘SERVER’), и подключимся к нему
LIB CONNECT TO ‘SERVER’; (указанную команду можно получит также, нажав на ярлык “Вставить строку подключения” )
2. Так как таблица хранится на MS SQL сервере, то получаем информацию из нее стандартным SQL- запросом - конструкцией select-from-where.
SELECT ***(перечень полей)*** FROM “Имя БД”.схема.”Имя Таблицы” WHERE ***условие выборки***

Ответить
Развернуть ветку
Андрей Лобанов

Здравствуйте, спасибо за статью!
А если для инкремента используются агрегированные данные, как лучше выстроить конкатенацию данных, чтобы в qvd-файл не попадали дубли?

Ответить
Развернуть ветку
NTA
Автор

Здравствуйте, немного позже вернусь с ответом )

Ответить
Развернуть ветку
NTA
Автор

Спасибо за вопрос.

Для того чтобы в QVB- файл не попадали дубли, Вам нужно заранее позаботиться о том, чтобы Ваши данные имели уникальный идентификатор, например, ID, и конкантенации указывать на исключение повтора.

Если при этом Вам нужно, чтобы загружались обновленные данные, указывайте дату обновления, например, DATE_UPDATE.

В нашем случае это может выглядеть так:

Ответить
Развернуть ветку
Андрей Лобанов

Спасибо!

Ответить
Развернуть ветку
3 комментария
Раскрывать всегда