ETL в Power BI: подготовка данных в Power Query и контроль загрузки

ETL в Power BI: подготовка данных в Power Query и контроль загрузки

Обновлено 2 сентября 2026 года.

ETL — последовательность извлечения, преобразования и загрузки данных. В Power BI часть этой работы выполняет Power Query. При сложных источниках или нескольких потребителях подготовку можно перенести в отдельное хранилище и подключить к нему модель. Решение зависит от объёма, истории изменений и требований к повторному использованию данных.

Извлечение: получить полный и понятный набор

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

Ограничьте выборку нужными полями и периодом, если источник это поддерживает. Условия запроса не гарантируют «минимальную нагрузку» автоматически: её нужно измерять. Пропуск страницы API, смена учётных данных и удаление столбца должны приводить к заметной ошибке загрузки, а не к незаметному сокращению отчёта.

Преобразование: типы и правила учёта

Power Query использует язык M. Меры DAX работают на уровне семантической модели и не заменяют извлечение из API или очистку исходного CSV. Разделяйте преобразование значения и его отображение: формат «рубли» сам по себе не преобразует текст в число и не конвертирует валюту.

В примере ниже исходные дата и сумма записаны текстом по российским правилам. Третья операция — возврат, уже представленный отрицательной суммой. Создайте пустой запрос в Power Query, откройте расширенный редактор и вставьте код:

let
    Source = #table(
        type table [OperationID = text, SaleDate = text, Amount = text],
        {
            {"1", "01.08.2026", "1000,50"},
            {"2", "02.08.2026", "2000,00"},
            {"3", "02.08.2026", "-500,00"}
        }
    ),
    Typed = Table.TransformColumnTypes(
        Source,
        {{"SaleDate", type date}, {"Amount", Currency.Type}},
        "ru-RU"
    ),
    Daily = Table.Group(
        Typed,
        {"SaleDate"},
        {{"NetAmount", each List.Sum([Amount]), Currency.Type}}
    ),
    Sorted = Table.Sort(Daily, {{"SaleDate", Order.Ascending}})
in
    Sorted

Ожидаются две строки: 1 августа — 1000,50; 2 августа — 1500,00. Общая сумма — 2500,50. OperationID остаётся текстом, поскольку это идентификатор, а не величина для вычислений. В данном примере регион задан явно; описание параметров есть у Table.TransformColumnTypes, группировка описана у Table.Group.

Читай также:  Python в Power BI: импорт, Power Query и визуализации

Группировка уменьшила детализацию до дня. Если отчёту нужны отдельные операции, загрузите Typed либо отдельный запрос с деталями. Не агрегируйте данные раньше, чем определены все необходимые разрезы.

Где выполняются преобразования

При query folding Power Query переводит поддерживаемые шаги в запрос к источнику. Остальные шаги выполняет собственный движок. Поддержка зависит от коннектора и операций; у обычного CSV нет движка запросов, которому можно передать такую работу. Проверяйте фактический запрос и объём получаемых данных. См. описание query folding.

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

Загрузка и обновление

В Import результат запроса загружается в модель. DirectQuery обращается к поддерживаемому источнику при запросах отчёта; его некорректно называть «прямой загрузкой» полной таблицы. Различия разобраны в статье о хранении данных Power BI.

Инкрементальное обновление модели работает с политикой обновления и партициями. Оно не является универсальным CDC, который автоматически обнаруживает любое изменение или удаление в CRM. Проверьте поздние изменения, выбранное поле даты и обработку удалений по документации инкрементального обновления.

Контроль качества после загрузки

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

Успешный статус задания нужно сопоставлять с полнотой данных. Для отчёта о продажах полезнее контроль «вчера поступило 0 операций при обычном потоке» вместе с журналом загрузки, чем одна зелёная отметка о выполнении.