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

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 несколькими ключевыми механизмами:

  1. Навигация по вложенным данным: Вместо плоских таблиц PartiQL позволяет обращаться к полям внутри вложенных структур с помощью точечной нотации (person.address.city) или квадратных скобок для массивов (orders[0].items[2].price). Это позволяет выполнять запросы к JSON-документам напрямую, без их предварительного разворачивания в плоскую таблицу.
  1. Необязательные поля и значения NULL: В SQL стандартное поведение при обращении к отсутствующему полю — ошибка. PartiQL обрабатывает отсутствующие поля как MISSING — специальное значение, отличное от NULL. Это позволяет безопасно запрашивать данные с необязательными атрибутами. Например, запрос SELECT person.name, person.middle_name FROM ... не вызовет ошибки, если у некоторых записей поле middle_name отсутствует — оно будет возвращено как MISSING.
  1. Работа с массивами: PartiQL поддерживает развёртывание массивов с помощью ключевого слова UNNEST, аналогично стандарту SQL:2016. Это позволяет преобразовывать элементы массива в отдельные строки результирующей таблицы. Например, запрос SELECT * FROM users, UNNEST(users.orders) AS order вернёт строку для каждого заказа каждого пользователя.
  1. Агрегация и группировка: Стандартные агрегатные функции SQL (SUM, AVG, COUNT, MIN, MAX) работают как с плоскими, так и с вложенными данными. Группировка (GROUP BY) также поддерживается, в том числе по полям, извлечённым из вложенных структур.
  1. Поддержка типов данных: PartiQL оперирует типами данных, характерными для реляционных баз (INTEGER, VARCHAR, DECIMAL, DATE, TIMESTAMP) и для полуструктурированных данных (ARRAY, OBJECT, BAG, MISSING).

Отличия от стандартного SQL

ХарактеристикаСтандартный SQLPartiQL
Модель данныхПлоские таблицы (строки и столбцы)Плоские таблицы, вложенные объекты, массивы
Обращение к полямТолько к столбцам таблицыК столбцам, полям вложенных объектов, элементам массивов
Обработка отсутствующих полейОшибка или 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). Многие пользователи предпочитают использовать встроенные функции своих баз данных, а не изучать новый язык.

Источники

  1. Спецификация PartiQL версии 1.0. Опубликована на официальном сайте проекта (partiql.org).
  2. Документация Amazon Web Services по PartiQL для Amazon DynamoDB.
  3. Документация Amazon Web Services по Amazon Athena и Amazon S3 Select.
  4. Репозиторий проекта PartiQL на GitHub (partiql/partiql-lang-kotlin).
  5. Статья «PartiQL: One Query Language for All Your Data» в блоге AWS Open Source (2019).
Заметили ошибку или не согласны с информацией в статье? Напишите нам support@bfometr.ru