Перед системным администратором, поддерживающим систему QlikView, периодически может вставать следующая задача: требуется выполнить сравнение двух идентичных по структуре QVD-файлов и выявить различающиеся между ними строки данных. В этой статье рассмотрим пример подобных задач, а затем рассмотрим универсальные алгоритм их реализации.

Сравнение двух QVD: Примеры

Примеры подобных ситуаций:

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

    Для этого вы хотите сравнить сегодняшнюю выгрузку в QVD с ее вчерашней архивной копией, найти изменившиеся строки данных и наглядно представить их на экране.

  • Вы вносите небольшие изменения в алгоритмы трансформаций и хотите проконтролировать, что в QVD на выходе получится именно то, что вы ожидаете. Для этого вы хотите создать новый QVD в «песочнице» и сравнить его с аналогичным QVD в продуктиве, найти отличающиеся строки данных и тщательно проверить, что изменения соответствуют ожиданиям.

Алгоритм решения задачи

Я сам несколько раз сталкивался с такой задачей на проекте и решил сделать достаточно универсальный алгоритм для ее решения. Результатом стало приложение QlikView, которое делает следующее:

  1. Загружает данные из двух указанных QVD и объединяет их (т.е. выполняет Join).
  2. Добавляет к структуре данных флаги, указывающие на статус «одинаковости» строк.
  3. С помощью простого пользовательского интерфейса визуализирует строки данных и позволяет выполнять навигацию/фильтрацию по одинаковым/неодинаковым строкам.
  4. И как дополнение — позволяет выгрузить в отдельные QVD различающиеся строки для их более детального анализа, в случае когда присутствует неуникальность строк в QVD.

Вот основной код скрипта с комментариями, который решает задачи 1 и 2:

НА ЗАМЕТКУ!

Что интересного можно отметить:

  • Загрузка данных из сверяемых QVD работает строго с применением квалификатора Distinct. В противном случае можно получить бессмысленное декартово произведение. Если же неуникальность строк в QVD — это данность, см. далее.
  • Активно используются методики Null Values Handling из арсенала Qlik.
    • Выполняется замена значений Null на текстовые строки ‘NULL’ с помощью команды NULLASVALUE. Это необходимо для корректной работы Join, который выполняет объединение только по реальным значениям в полях. Принудительно выключается режим QVD Optimized Load, чтобы NULLASVALUE корректно работала.
    • После загрузки и объединения данных, значения Null заменяются на 0 с помощью удобной функции Alt().
  • Сверяемые QVD файлы должны быть строго идентичны по структуре (одинаковый состав полей), иначе осмысленное сравнение будет невозможно.

Скрипт создает простую модель данных из одной таблицы со структурой из QVD и двумя добавленными флагами _Qvd01 и _Qvd02, в которых у каждой строки стоит 1, если она представлена в 1-м/2-м QVD, и 0 ­– если нет.

У одинаковых строк 1 будет стоять в обоих полях, а у неодинаковых – 0 в одном из полей. Применяя фильтры на эти поля, можно соответственно выбрать три множества строк данных:

  1. Одинаковые (1 и 1).
  2. Есть в первом QVD, но нет во втором (1 и 0).
  3. Есть во втором QVD, но нет в первом (0 и 1).

А вот как визуализация выглядит в интерфейсе пользователя:

Main _Q*d01 0 (hg'i'eifi _Qvd01

Видно, что среди 7 млн. строк первого QVD нашлось 6,95 млн. аналогичных второму QVD и 50 тыс. отсутствующих во втором.

Чтобы найти конкретный пример отличий, применим фильтр 1 в первом флаге, и 0 во втором; выберем первые по счету значения ключей измерений в таблице и снимем фильтры с флагов.

Получили пример строки данных, которая различается между QVD и сразу видно, в чем именно:

Main Current DEPT AGENT Doc BATCH Q 6-0009515 SLIPP[Q 8596 „uvdez 1044,2679 101135664

Ну а для того, чтобы выгрузить различающиеся строки в отдельные QVD для их более детального анализа/агрегации в отдельном приложении QV, можно дополнить скрипт следующим опциональным кодом. Обратите внимание, что если в ваших данных присутствует неуникальность, то это способ ее обойти и выгрузить все нужные данные без обрезок.

Друзья, вот, мы и решили поставленную задачу сравнения QVD-файлов и нашли разные строки данных.

Какие у вас есть идеи использования данного алгоритма? Для каких задач он еще будет актуален?

Буду рад прочитать ваши комментарии.

До новых встреч!