Перейти к основному содержимому

Обработка иерархических данных

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

От верхней до нижней части иерархии члены иерархии становятся более детализированными. Например, в измерении с уровнями «Рынок», «Страна», «Штат» или «Город» член «Америка» появляется на верхнем уровне иерархии, член «США» появляется на втором уровне, член «Калифорния» — на третьем, а «Сан-Франциско» — на нижнем уровне. «Калифорния» — более конкретное понятие, чем «США», а «Сан-Франциско» более конкретное, чем «Калифорния».

Сохранение иерархий в реляционной модели — это обычная задача со множеством решений. Существует несколько подходов:

  • Горизонтальная иерархия
  • Модель списка смежных вершин
  • Способ перечисления путей
  • Модель вложенных наборов
  • Родительский список

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

Префикс Hierarchy

Префикс Hierarchy является командой скрипта, которая ставится перед оператором LOAD или SELECT, который загружает таблицу со смежными узлами. У оператора LOAD должно быть как минимум три поля: идентификатор, который является уникальным ключом к узлу, ссылка на родителя и имя.

С помощью префикса загруженная таблица будет преобразована в таблицу расширенных узлов; таблицу с дополнительными столбцами, по одному для каждого уровня иерархии.

  1. Создайте новое приложение и дайте ему имя.
  2. Добавьте новый раздел скрипта в Редакторе загрузки данных.
  3. Вызовите раздел Wine.
  4. Под элементом DataFiles в меню справа щелкните Выбрать данные.

  5. Загрузите, а затем выберите Winedistricts.txt.
  6. В окне Выбор данных из снимите флажки для полей Lbound и RBound, чтобы не осуществлялась их загрузка.
  7. Щелкните команду Вставить скрипт.
  8. Введите следующее над оператором LOAD:
  9. Hierarchy (NodeID, ParentID, NodeName)

    Скрипт должен выглядеть следующим образом:

    Hierarchy (NodeID, ParentID, NodeName) LOAD     NodeID,     ParentID,     NodeName FROM [lib://DataFiles/Winedistricts.txt]  (txt, utf8, embedded labels, delimiter is '\t', msq);			

  10. Щелкните команду Загрузить данные.
  11. Используйте раздел Предварительный просмотр просмотра модели данных, чтобы просмотреть полученную таблицу.
  12. Полученная таблица расширенных узлов имеет то же число записей, что и исходная таблица: по одной записи на узел. Таблица расширенных узлов очень практична, поскольку она отвечает ряду следующих требований для анализа иерархии в реляционной модели.

    • Все имена узлов находятся в одном и том же столбце, поэтому это можно использовать для поиска.
    • Кроме того, различные уровни узлов были расширены так, что у каждого из них по одному полю; эти поля можно использовать в группах детализации или в качестве измерений в сводных таблицах.
    • Кроме того, различные уровни узлов были расширены так, что у каждого из них по одному полю; эти поля можно использовать в группах детализации.
    • Это можно сделать, чтобы указать путь, уникальный для каждого узла, с перечислением всех родителей в правильном порядке.
    • Это можно сделать, чтобы указать глубину узла, т. е. расстояние от корневой папки.

    Полученная таблица выглядит следующим образом:

    Таблица, в которой отображаются данные образца, загруженные с помощью префикса Hierarchy

    Таблица, в которой отображаются данные образца, загруженные с помощью префикса Hierarchy.
Примечание об информацииЧтобы узнать дополнительные сведения об иерархиях, см. эту запись блога в Qlik Community: Иерархии

Префикс HierarchyBelongsTo

Как и префикс Hierarchy, префикс HierarchyBelongsTo представляет собой команду скрипта, которая помещается перед оператором LOAD или SELECT, загружающим таблицу со смежными узлами.

Также у оператора LOAD должно быть как минимум три поля: идентификатор, который является уникальным ключом к узлу, ссылка на родителя и имя. С помощью префикса загруженная таблица будет преобразована в родительскую таблицу, таблицу со всевозможными комбинациями родителя и потомка, указанными в виде отдельной записи. Таким образом, очень просто найти всех родителей или всех потомков определенного узла.

  1. Измените оператор Hierarchy в редакторе загрузки данных, чтобы он выглядел так:
  2. HierarchyBelongsTo (NodeID, ParentID, NodeName, BelongsToID, BelongsTo)
  1. Щелкните команду Загрузить данные.
  2. Используйте раздел Предварительный просмотр просмотра модели данных, чтобы просмотреть полученную таблицу.
  3. Родительская таблица отвечает ряду требований для анализа иерархии в реляционной модели:

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

    Полученная таблица выглядит следующим образом:

    Таблица, в которой отображаются данные, загруженные с помощью префикса HierarchyBelongsTo

    Таблица, в которой отображаются данные, загруженные с помощью префикса HierarchyBelongsTo.

Авторизация

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

Пример иерархии организационной структуры

Это значит, что разные люди будут иметь доступ к разным поддеревьям организации. Таблица авторизации может выглядеть так:

Таблица авторизации
ACCESS NTNAME PERSON POSITION PERMISSIONS
USER ACME\JRL John CPO HR
USER ACME\CAH КэролCarol CEO CEO
USER ACME\JER James Director Engineering Engineering
USER ACME\DBK Diana CFO Finance
USER ACME\RNL Bob COO Sales
USER ACME\LFD Larry CTO Продукт

В этом случае Carol может видеть все, что относится к CEO и ниже; Larry может видеть организацию Product; а James может видеть только организацию Engineering.

Пример:  

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

Для использования Section Access загрузите копию поля Tree и присвойте этому новому полю имя PERMISSIONS. И наконец, следует загрузить таблицу авторизации. Выполнить два последних шага можно с помощью следующих строк скрипта. Обратите внимание, что таблица TempTrees является таблицей, созданной оператором HierarchyBelongsTo.

Обратите внимание, что это просто пример. Здесь нет сопутствующих упражнений, которые следует выполнить в Qlik Sense.

Trees: LOAD *, Upper(Tree) as PERMISSIONS Resident TempTrees; Drop Table TempTrees;   Section Access; Authorization: LOAD ACCESS, NTNAME, UPPER(Permissions) as PERMISSIONS From Organization; Section Application;

В этом примере будет получена следующая модель данных:

Модель данных: Таблицы Authorization, Trees, Fact и Nodes

Модель данных: