Открыть сервис

Язык формул M

Язык формул M (также известный как M или Power Query Formula Language) — это функциональный язык программирования, предназначенный для манипулирования данными, их преобразования и загрузки. Он является основным языком запросов в таких продуктах Microsoft, как Power Query (встроенный в Power BI, Excel, Azure Data Factory и другие сервисы), а также в Power BI Desktop и Dataflows. M относится к классу языков, ориентированных на обработку табличных данных, и сочетает в себе элементы функционального программирования с возможностями работы с наборами данных, напоминающими SQL.

История

Язык M был разработан компанией Microsoft как часть платформы Power Query, впервые представленной в 2013 году для Excel 2013. Изначально он назывался «Power Query Formula Language» или «M Language». Основной целью создания M было предоставление пользователям и разработчикам гибкого и мощного инструмента для извлечения, очистки и преобразования данных из различных источников (базы данных, веб-страницы, файлы CSV, Excel, JSON и т.д.) без необходимости написания сложного кода на других языках. В 2015 году с выходом Power BI язык M стал его неотъемлемой частью, а в 2016 году Microsoft открыла спецификацию языка, что позволило сторонним разработчикам создавать собственные реализации.

Основные характеристики

Функциональная парадигма

M является чисто функциональным языком: все вычисления в нём выполняются через функции, а переменные (называемые «идентификаторами») являются неизменяемыми (immutable). Это означает, что после присвоения значения идентификатору его нельзя изменить, что упрощает отладку и предотвращает побочные эффекты. Функции в M являются объектами первого класса: их можно передавать в качестве аргументов, возвращать из других функций и сохранять в переменных.

Типизация

M — язык со строгой, но динамической типизацией. Типы данных включают:

  • Примитивные: число (number), текст (text), логическое значение (logical), дата (date), время (time), дата/время (datetime), null (отсутствие значения).
  • Составные: список (list), запись (record), таблица (table), функция (function), тип (type).

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

Выражения и вычисления

Код на M состоит из выражений, которые вычисляются в значения. Выражения могут включать:

  • Литералы (например, 123, "Привет", true).
  • Идентификаторы (например, Source, Table1).
  • Вызовы функций (например, Table.SelectRows).
  • Условные конструкции (if ... then ... else).
  • Лямбда-выражения (анонимные функции, например, each _ > 5).

Вычисления в M являются ленивыми (lazy) по умолчанию: значения вычисляются только тогда, когда они необходимы для дальнейшего использования. Это позволяет эффективно работать с большими наборами данных, не загружая их в память целиком.

Иерархия данных

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

Синтаксис и структура

Базовый синтаксис

Код на M пишется в редакторе Power Query или в текстовых файлах с расширением .m. Основные элементы:

  • Комментарии: однострочные (//) и многострочные (/ ... /).
  • Идентификаторы: начинаются с буквы или подчёркивания, могут содержать буквы, цифры и подчёркивания. Для использования зарезервированных слов или специальных символов применяются кавычки-ёлочки (#"Имя").
  • Операторы: арифметические (+, -, *, /), сравнения (=, <>, <, >), логические (and, or, not), конкатенация текста (&), объединение списков (&), доступ к элементам ([ для записей, { для списков).

Пример простого запроса

```m let Source = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],

"Изменённый тип" = Table.TransformColumnTypes(Source,{{"Колонка1", type text}, {"Колонка2", type number}})

in

"Изменённый тип"

``` Здесь:

  • let — блок, в котором определяются шаги (переменные).
  • in — выражение, которое возвращает итоговое значение.
  • Каждый шаг может ссылаться на предыдущие.

Функции

Функции в M определяются с помощью ключевого слова let или через лямбда-синтаксис. Пример: ``m let Add = (x as number, y as number) as number => x + y, Result = Add(5, 3) in Result ` Также существует сокращённая форма each, которая автоматически создаёт функцию с одним параметром _: `m let List = {1, 2, 3, 4, 5}, GreaterThanThree = List.Select(List, each _ > 3) in GreaterThanThree ``

Применение

Power Query

Основная область применения M — Power Query, встроенный инструмент в Microsoft Excel и Power BI. С помощью M пользователи могут:

  • Извлекать данные из различных источников: реляционные базы данных (SQL Server, Oracle, PostgreSQL), веб-API, облачные сервисы (Azure, Salesforce), файлы (CSV, Excel, JSON, XML, PDF).
  • Преобразовывать данные: фильтрация, сортировка, группировка, объединение таблиц, изменение типов, удаление дубликатов, замена значений, создание вычисляемых столбцов.
  • Очищать данные: исправление ошибок, удаление пустых строк, стандартизация форматов.
  • Загружать данные в модель данных Power BI или в лист Excel.

Power BI

В Power BI M используется для создания запросов в Power Query Editor, а также для написания пользовательских функций (например, для повторяющихся преобразований). M-запросы могут быть встроены в отчёты или опубликованы в сервисе Power BI.

Azure Data Factory и Dataflows

M также поддерживается в Azure Data Factory (через Power Query Activity) и в Dataflows в Power Platform. Это позволяет автоматизировать ETL-процессы (Extract, Transform, Load) в облачной среде.

Другие реализации

Хотя M является проприетарным языком Microsoft, его спецификация открыта, что позволило создать несколько сторонних реализаций, таких как:

  • M Language SDK для .NET.
  • M Language Compiler — экспериментальный компилятор, транслирующий M в C#.

Сравнение с другими языками

M и SQL

M и SQL оба предназначены для работы с табличными данными, но имеют принципиальные различия:

  • Парадигма: SQL — декларативный язык, описывающий, что нужно получить; M — функциональный, описывающий как преобразовать данные.
  • Вычисления: SQL работает с наборами данных на сервере; M — на стороне клиента (в памяти или потоково).
  • Гибкость: M позволяет выполнять сложные преобразования, которые в SQL требуют использования хранимых процедур или рекурсивных CTE.

M и Python (Pandas)

Python с библиотекой Pandas также используется для обработки данных, но:

  • Интеграция: M встроен в Power BI и Excel, не требует установки дополнительных библиотек.
  • Производительность: M оптимизирован для работы с большими объёмами данных в памяти, но уступает Pandas в гибкости для сложных аналитических задач.
  • Сообщество: Pandas имеет более широкое сообщество и больше библиотек, но M — стандарт для платформы Microsoft.

Критика и ограничения

  • Сложность синтаксиса: Для новичков M может показаться запутанным из-за обилия скобок, ключевых слов и необходимости явно указывать типы.
  • Ограниченная отладка: Встроенные инструменты отладки в Power Query минимальны; ошибки часто возникают на этапе выполнения, а не компиляции.
  • Производительность: Некоторые операции (например, объединение больших таблиц) могут быть медленными, особенно при работе с сотнями тысяч строк.
  • Зависимость от Microsoft: M тесно связан с экосистемой Microsoft, что ограничивает его использование в других средах (хотя есть сторонние реализации).

Интересные факты

  • Название «M» не является официальной аббревиатурой; по одной из версий, оно происходит от «Mashup» (смешивание), так как язык изначально создавался для объединения данных из разных источников.
  • Язык M поддерживает рекурсию, но она редко используется из-за ограничений на глубину стека.
  • В Power Query существует встроенный редактор, который генерирует M-код автоматически при выполнении операций через графический интерфейс, что позволяет пользователям не писать код вручную.

Источники

  • Microsoft Docs: Power Query M formula language reference
  • Ben Gribaudo, «M is for Data Monkey: A Guide to the M Language in Excel Power Query»
  • Gil Raviv, «Collect, Combine, and Transform Data Using Power Query in Excel and Power BI»
  • Спецификация языка M (Microsoft Open Specification)

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →