Объединение и оптимизация данных

Завершено

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

В этом модуле вы узнаете о различных способах объединения данных в запросах Kusto, чтобы предоставить участникам команды информацию, необходимую для повышения осведомленности о продуктах и роста продаж.

Расшифровка данных

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

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

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

Вы также хотите понять объемы данных, с которыми вы работаете, и ее структуру, или схему (имена столбцов и типы). Чтобы получить эти сведения, можно выполнить следующие запросы, заменив TABLE_NAME именем проверяемой таблицы:

  • Чтобы получить количество записей в таблице, используйте count оператор:

    TABLE_NAME
    | count
    
  • Чтобы получить схему таблицы, используйте getschema оператор:

    TABLE_NAME
    | getschema
    

Выполнение этих запросов на таблицы фактов и измерений в сценарии розничной компании дает сведения, как показано в следующем примере:

Таблица Записи Схема
ФактПродаж 2,832,193 — SalesAmount (real)
- TotalCost (real)
— DateKey (datetime)
- ProductKey (long)
- CustomerKey (long)
Клиенты 18,484 — CityName (строка)
— CompanyName (string)
— ContinentName (строка)
- CustomerKey (long)
— Образование (строка)
— FirstName (string)
- Пол (строка)
- LastName (string)
- MaritalStatus (string)
— оккупация (строка)
— RegionCountryName (string)
— StateProvinceName (строка)
Товары 2,517 — ProductName (строка)
- Производитель (строка)
— ColorName (строка)
— ClassName (string)
— ProductCategoryName (строка)
— ProductSubcategoryName (string)
- ProductKey (long)

В таблице выделены уникальные идентификаторы CustomerKey и ProductKey, которые используются для объединения записей между таблицами.

Общие сведения о запросах с несколькими таблицами

После анализа данных необходимо понять, как объединить таблицы для предоставления необходимых сведений. Запросы Kusto предоставляют несколько операторов, которые можно использовать для объединения данных из нескольких таблиц, включая lookupjoinоператоры и union операторы.

Оператор join объединяет строки двух таблиц путем сопоставления значений указанных столбцов из каждой таблицы. Результирующая таблица зависит от типа используемого соединения. Например, при использовании внутреннего соединения таблица имеет те же столбцы, что и левая таблица (иногда называемая внешней таблицей), а также столбцы из правой таблицы (иногда называются внутренней таблицей). Дополнительные сведения о типах присоединения см. в следующем разделе. Для оптимальной производительности, если одна таблица всегда меньше другой, используйте ее в качестве левой join стороны оператора.

Оператор lookup — это специальная реализация join оператора, который оптимизирует производительность запросов, в которых таблица фактов обогащена данными из таблицы измерений. Она расширяет таблицу фактов со значениями, которые находятся в таблице измерений. Для оптимальной производительности система по умолчанию предполагает, что левая таблица является большей (факт) таблицей, а справа — меньшей (измерением). Это предположение является именно противоположностью допущения, используемого оператором join .

Оператор union возвращает все строки из двух или более таблиц. Полезно, если требуется объединить данные из нескольких таблиц.

Функция materialize() кэширует результаты выполнения запроса для последующего повторного использования в запросе. Это как создание моментального снимка результатов вложенного запроса и его многократное использование в запросе. Эта функция полезна при оптимизации запросов для сценариев, в которых результаты:

  • Затраты на вычисление
  • Недетерминированные

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

Виды соединения

Diagram showing query join kinds.

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

Тип соединения Description Иллюстрация
innerunique (по умолчанию) Внутреннее соединение с удалением дубликатов в левой части
Схема: все столбцы из обеих таблиц, включая соответствующие ключи
Строки: все дедупликированные строки из левой таблицы, соответствующие строкам из правой таблицы
inner Стандартное внутреннее соединение
Схема: все столбцы из обеих таблиц, включая соответствующие ключи
Строки: только соответствующие строки из обеих таблиц
leftouter левое внешнее соединение.
Схема: все столбцы из обеих таблиц, включая соответствующие ключи
Строки: все записи из левой таблицы и только соответствующие строки из правой таблицы
rightouter Правое внешнее соединение
Схема: все столбцы из обеих таблиц, включая соответствующие ключи
Строки: все записи из правой таблицы и только соответствующие строки из левой таблицы
fullouter Полное внешнее соединение
Схема: все столбцы из обеих таблиц, включая соответствующие ключи
Строки: все записи из обеих таблиц с несовпадными ячейками, заполненными значением NULL
leftsemi Левое полусоединение
Схема: все столбцы из левой таблицы
Строки: все записи из левой таблицы, соответствующие записям из правой таблицы
leftanti, , antileftantisemi Левый антисоединяние и полу-вариант
Схема: все столбцы из левой таблицы
Строки: все записи из левой таблицы, которые не соответствуют записям из правой таблицы
rightsemi Правое полусоединение
Схема: все столбцы из правой таблицы
Строки: все записи из правой таблицы, соответствующие записям из левой таблицы
rightanti, rightantisemi Правый антисоединяние и полу-вариант
Схема: все столбцы из правой таблицы
Строки: все записи из правой таблицы, не соответствующие записям из левой таблицы

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

По мере выполнения этого модуля вы также узнаете о arg_min() функциях и arg_max() агрегирования, as операторе в качестве альтернативы let инструкции и startofmonth() функции, помогающей сгруппировать данные по месяцам.