PartiQL
PartiQL — это язык запросов, совместимый с SQL, предназначенный для работы с данными, имеющими нереляционную, вложенную или слабоструктурированную структуру. Он разработан для обеспечения единого интерфейса запросов к различным источникам данных, включая реляционные базы данных, документоориентированные хранилища (например, JSON-документы), графовые базы данных и файлы в форматах Parquet, CSV и другие. PartiQL является расширением SQL, позволяющим обращаться к вложенным данным, массивам и необязательным полям без необходимости предварительного преобразования схемы.
История
PartiQL был представлен в 2019 году компанией Amazon Web Services (AWS) как проект с открытым исходным кодом. Разработка была мотивирована необходимостью унифицировать доступ к данным, хранящимся в различных сервисах AWS, таких как Amazon S3 (через Amazon Athena и Amazon S3 Select), Amazon DynamoDB (через PartiQL для DynamoDB) и Amazon Redshift. Первоначальная спецификация была основана на опыте работы с языками запросов для полуструктурированных данных, в частности на проекте Apache Hive и внутренних разработках AWS. В 2020 году была выпущена версия 1.0 спецификации, закрепившая основные синтаксические конструкции и семантику. Сообщество разработчиков поддерживает эталонную реализацию на Java, а также адаптации для других языков программирования, включая Python.
Классификация
PartiQL относится к категории языков запросов для полуструктурированных и вложенных данных. Его можно классифицировать по следующим признакам:
- По совместимости: Является надмножеством SQL-92, что означает, что любой корректный запрос SQL-92 также является корректным запросом PartiQL. Это обеспечивает обратную совместимость с существующими реляционными системами.
- По типу данных: Поддерживает реляционные (таблицы, строки, столбцы), полуструктурированные (JSON, XML-подобные структуры) и вложенные (массивы, вложенные объекты) модели данных.
- По области применения: Универсальный язык для аналитических (OLAP) и транзакционных (OLTP) нагрузок, хотя его основное применение — аналитические запросы к большим объёмам данных в облачных хранилищах.
- По парадигме: Декларативный язык, где пользователь описывает, какие данные нужно получить, а не как это сделать.
Устройство и характеристики
Синтаксис и семантика
PartiQL расширяет стандартный SQL несколькими ключевыми механизмами:
- Навигация по вложенным данным: Вместо плоских таблиц PartiQL позволяет обращаться к полям внутри вложенных структур с помощью точечной нотации (
person.address.city) или квадратных скобок для массивов (orders[0].items[2].price). Это позволяет выполнять запросы к JSON-документам напрямую, без их предварительного разворачивания в плоскую таблицу.
- Необязательные поля и значения NULL: В SQL стандартное поведение при обращении к отсутствующему полю — ошибка. PartiQL обрабатывает отсутствующие поля как
MISSING— специальное значение, отличное отNULL. Это позволяет безопасно запрашивать данные с необязательными атрибутами. Например, запросSELECT person.name, person.middle_name FROM ...не вызовет ошибки, если у некоторых записей полеmiddle_nameотсутствует — оно будет возвращено какMISSING.
- Работа с массивами: PartiQL поддерживает развёртывание массивов с помощью ключевого слова
UNNEST, аналогично стандарту SQL:2016. Это позволяет преобразовывать элементы массива в отдельные строки результирующей таблицы. Например, запросSELECT * FROM users, UNNEST(users.orders) AS orderвернёт строку для каждого заказа каждого пользователя.
- Агрегация и группировка: Стандартные агрегатные функции SQL (
SUM,AVG,COUNT,MIN,MAX) работают как с плоскими, так и с вложенными данными. Группировка (GROUP BY) также поддерживается, в том числе по полям, извлечённым из вложенных структур.
- Поддержка типов данных: PartiQL оперирует типами данных, характерными для реляционных баз (INTEGER, VARCHAR, DECIMAL, DATE, TIMESTAMP) и для полуструктурированных данных (ARRAY, OBJECT, BAG, MISSING).
Отличия от стандартного SQL
| Характеристика | Стандартный SQL | PartiQL |
|---|---|---|
| Модель данных | Плоские таблицы (строки и столбцы) | Плоские таблицы, вложенные объекты, массивы |
| Обращение к полям | Только к столбцам таблицы | К столбцам, полям вложенных объектов, элементам массивов |
| Обработка отсутствующих полей | Ошибка или NULL (в зависимости от реализации) | Значение MISSING (отдельный тип) |
| Развёртывание массивов | Через UNNEST (стандарт SQL:2016) | Через UNNEST (аналогично) |
| Совместимость | Строго реляционная | Надмножество SQL-92 |
Применение
PartiQL нашёл применение в нескольких ключевых областях:
Анализ данных в облачных хранилищах
Основное применение PartiQL — это выполнение SQL-запросов к данным, хранящимся в объектных хранилищах, таких как Amazon S3. Сервисы Amazon Athena и Amazon S3 Select используют PartiQL для чтения данных в форматах JSON, Parquet, ORC, Avro и CSV. Это позволяет аналитикам и инженерам данных использовать знакомый SQL-синтаксис для работы с полуструктурированными данными без необходимости загружать их в реляционную базу данных.
Работа с NoSQL-базами данных
PartiQL используется в Amazon DynamoDB (NoSQL-база данных) для выполнения запросов. Это даёт возможность пользователям, привыкшим к SQL, выполнять операции чтения, записи и обновления данных в DynamoDB, используя синтаксис, близкий к SQL. Например, запрос SELECT * FROM "Music" WHERE "Artist" = 'Acme Band' AND "SongTitle" = 'Happy Day' выполняется в DynamoDB через PartiQL.
Интеграция с реляционными базами данных
Поскольку PartiQL является надмножеством SQL-92, он может использоваться как интерфейс для работы с традиционными реляционными базами данных (например, PostgreSQL, MySQL). Это позволяет создавать универсальные клиентские приложения, которые могут подключаться как к реляционным, так и к нереляционным источникам данных, используя один и тот же язык запросов.
Обработка потоковых данных
PartiQL может применяться в системах обработки потоков данных (например, Amazon Kinesis Data Analytics) для фильтрации, агрегации и трансформации данных в реальном времени. Благодаря поддержке вложенных структур, он эффективно обрабатывает JSON-сообщения, поступающие из IoT-устройств, веб-приложений или логов.
Примеры
Пример 1: Запрос к вложенным данным
Допустим, есть таблица employees с колонкой details, содержащей JSON-объект:
``json {"name": "Иван", "address": {"city": "Москва", "street": "Тверская"}, "phones": ["+7-495-123-45-67", "+7-916-987-65-43"]} ``
Запрос PartiQL для получения имени, города и первого номера телефона:
``sql SELECT e.details.name, e.details.address.city, e.details.phones[0] AS primary_phone FROM employees e ``
Пример 2: Развёртывание массива
Запрос для получения всех номеров телефонов всех сотрудников:
``sql SELECT e.details.name, p AS phone FROM employees e, UNNEST(e.details.phones) AS p ``
Пример 3: Обработка отсутствующих полей
Если у некоторых сотрудников поле middle_name отсутствует, запрос не вызовет ошибку:
``sql SELECT e.details.name, e.details.middle_name FROM employees e ` В результатах для записей без отчества поле middle_name будет иметь значение MISSING`.
Критика
Несмотря на преимущества, PartiQL имеет ряд ограничений и критических замечаний:
- Сложность реализации: Полная реализация спецификации PartiQL, особенно поддержка вложенных структур и обработка
MISSING, требует значительных усилий от разработчиков систем баз данных. Не все сервисы AWS реализуют полную спецификацию; например, PartiQL для DynamoDB поддерживает только подмножество возможностей языка. - Производительность: Запросы, активно использующие навигацию по глубоко вложенным структурам или развёртывание больших массивов, могут быть менее производительными по сравнению с оптимизированными запросами к плоским таблицам. Это требует тщательной настройки запросов и индексации данных.
- Ограниченная экосистема: По состоянию на 2024 год, PartiQL в основном поддерживается в продуктах AWS. Существуют сторонние реализации (например, библиотека
partiql-lang-kotlin,partiql-python), но их функциональность и поддержка сообщества значительно уступают эталонной реализации от Amazon. - Конкуренция с другими стандартами: PartiQL конкурирует с другими подходами к работе с полуструктурированными данными в SQL, такими как расширения в PostgreSQL (JSONB,
->>,#>) или MySQL (JSON_EXTRACT). Многие пользователи предпочитают использовать встроенные функции своих баз данных, а не изучать новый язык.
Источники
- Спецификация PartiQL версии 1.0. Опубликована на официальном сайте проекта (partiql.org).
- Документация Amazon Web Services по PartiQL для Amazon DynamoDB.
- Документация Amazon Web Services по Amazon Athena и Amazon S3 Select.
- Репозиторий проекта PartiQL на GitHub (partiql/partiql-lang-kotlin).
- Статья «PartiQL: One Query Language for All Your Data» в блоге AWS Open Source (2019).
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →