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

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 относится к категории языков запросов для полуструктурированных и вложенных данных. Его можно классифицировать по следующим признакам:

Устройство и характеристики

Синтаксис и семантика

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 имеет ряд ограничений и критических замечаний:

Источники

  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).

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

На главную BFOmetr →