Язык формул 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 →