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

Подключение внешних источников

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

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

Каждая внешняя связь -- это некоторый набор полей, привязанный к какой-то размерности. При этом внешняя связь может сохранять как значение этой размерности, так и идентификатор значения в словаре, где и хранится отображение идентификатора размерности в её значение.

Например:

Пример внешней связи

Стандартные внешние связи

В схеме по умолчанию есть две внешние связи, реализация которых входит в пакет yupana-external-links. Реализация DAO для этих внешних связей поверх HBase входит в пакет yupana-hbase.

ItemsInvertedIndex

Индекс слов встречающихся в товарах. Используется для полнотекстового поиска в наименованиях товаров

Поля:

  • phrase -- слова для поиска. Порядок слов не имеет значения, например "пиво жигулевское" и "жигулевское пиво". Поскольку внутри каталога слова хранятся в стемированном виде, при поиске окончания не учитываются. Запросы "пиво жигулевское" и "пиву жигулевскому" считаются одинаковыми (и пребразуются к набору слов "piv", "zhigulevsk").

RelatedItemsCatalog

Каталог сопутствующих товаров. Позволяет находить совместные покупки товаров.

Поля:

  • item -- строгое название сопутствующего товара (чекового наименования).
  • phrase -- часть названия сопутствующего товара (чекового наименования), аналогично полю phrase в ItemsInvertedIndex.

Поля каталога могут использоваться только в условиях (а не как поля запроса). Рекомендуется использовать со схемой kkm_items.

Примеры:

  1. Ищем покупки вместе с пивом:
SELECT item, time, kkmId 
FROM kkm_items
WHERE time >= TIMESTAMP '2018-11-01' AND time < TIMESTAMP '2018-12-01'
AND RelatedItemsCatalog_phrase = 'пиво'
  1. Ищем номера чеков, в которых присутствуют пиво и чипсы:
SELECT item, time, kkmId, documentNumber
FROM kkm_items
WHERE time >= TIMESTAMP '2018-11-01' AND time < TIMESTAMP '2018-12-01'
AND RelatedItemsCatalog_phrase = 'пиво'
AND itemsInvertedIndex_phrase = 'чипсы'
  1. Ищем номера чеков, где присутствуют пиво и чипсы, но нет орешков:
SELECT item, time, kkmId, documentNumber 
FROM kkm_items
WHERE time >= TIMESTAMP '2018-11-01' AND time < TIMESTAMP '2018-12-01'
AND RelatedItemsCatalog_phrase = 'пиво'
AND itemsInvertedIndex_phrase = 'чипсы'
AND RelatedItemsCatalog_phrase <> 'орешки'

Схема работы внешней связи

При выполнении запроса к Yupana внешняя связь может принимать участие в двух этапах обработки запроса.

Трансформация запроса

На этом этапе условия из запроса, относящиеся к каталогу, преобразуются в условия в терминах размерностей и/или метрик. Например, заданные в условии ИНН преобразуются в наборы идентификаторов касс.

Извлечение значений

Если поля внешней связи являются частью результата запроса, то внешняя связь должна заполнить эти поля в результирующем наборе данных.

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

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