Amazon представил PartiQL: совместимый с SQL язык запросов к данным в различных форматах

Запись об этом появилась в блоге AWS в начале августа. Эталонная реализация выложена на GitHub.


8dtrrfxz4uabjrrtzkbxezrsnwm.png


Почему это важно?

ПО поедает мир, а облака начинают поедать ПО. Перенос все большей части инфраструктуры клиента в облако — в интересах и поставщика облачных сервисов, и самого клиента. Первый заинтересован по финансовым соображениям, второй — для обеспечения возможности интеграции своих данных. Здесь, как говорится, если коготок увяз, всей птичке пропасть.

С этой точки зрения интересно, какие именно решения по интеграции данных предлагаются в облаках, поскольку эти решения заведомо должны быть передовыми и идеологически выверенными. И вот три недели назад Amazon предложил решение класса NoETL — обратно совместимый с SQL-92 язык для запросов к данным в различных форматах.

Язык PartiQL идейно схож с SQL++, получившим высокую оценку Д. Чемберлина, одного из соавторов SQL (Чемберлин даже написал учебник по SQL++). Сходство двух языков неслучайно: автор обоих — один и тот же человек, Яннис Папаконстантину.

К слову, Couchbase, в которой поддержка SQL++ недавно была реализована, обещает рассмотреть возможность поддержать PartiQL, а пока что PartiQL поддерживается в Amazon S3 Select, в Amazon Redshift Spectrum (в той степени, в которой тот поддерживает абстрактную модель данных PartiQL, о которой ниже) и используется во внутренних системах Amazon.


Технические детали

В основе всего — абстрактная модель данных PartiQL. Выясним сперва, как в ней будут представлены реляционные данные. Пусть есть база с таблицей, в которой для каждого человека указано название кафе, в котором он любит собираться которое он любит посещать больше всего.


Данные

В абстрактной модели PartiQL эти данные будут выглядеть так:

{ 
   "silovikicat": { 
        "people": <<
            { "name": "Алиса", "likes": "Жан-Жак" } ,
            { "name": "Боб",   "likes": "Джон Донн" }
        >>
    }
}

Использование << и >> вместо [ и ] означает, что элементы коллекции не упорядочены (как и положено в реляционной модели кортежам в отношении). Не такое уж большое расширение JSON по сравнению с Amazon Ion, но если не нравится, можно использовать и обычные массивы вместо мультимножеств.


Запрос

Запрос на PartiQL выглядит так:

SELECT p.name AS person, p.likes AS cafe
FROM silovikicat.people AS p
WHERE p.name = "Алиса"


Результат

Результат будет таким:

<<
  {
    "person" : "Алиса", "cafe": "Жан-Жак"
  }
>>

Если вам показалось, что точка в полном идентификаторе таблицы немного двусмысленна, то да, это так. Оператор «.» получает по ключу значение и позволяет обходить иерархические структуры, если они оказываются значениями полей. Можно строить цепочки любой длины. Если по пути попадается массив, можно получить элемент по индексу в квадратных скобках (и [*] тоже можно). Вроде бы пока почти ничего нового по сравнению с поддержкой JSONPath в РСУБД, умеющих работать с JSON?

Однако попробуем кое-что посложнее. Допустим, значением likes является массив, и упорядочение элементов имеет некоторое значение. Хотелось бы не потерять этот порядок в результатах запроса.


Данные
{ 
   "silovikicat": { 
        "people": <<
            {
                "name": "Алиса",
                "likes": [
                    { "name": "Жан-Жак" },
                    { "name": "Джон Донн" } 
                ]
            } ,
            {
                "name": "Боб",
                "likes": [ 
                    { "name": "Джон Донн" } 
                ] 
            }
        >>
    }
}


Запрос
SELECT p.name AS person_name, 
       o AS cafe_priority
       c.name AS cafe_name, 
FROM silovikicat.people AS p, 
     p.likes AS c AT o
WHERE p.name = 'Алиса'
ORDER BY cafe_priority ASC


Результат
[
  {
    "person_name": "Алиса", "cafe_priority": 0, "сafe_name": "Жан-Жак"
  },
  {
    "person_name": "Алиса", "cafe_priority": 1, "cafe_name": "Джон Донн"
  }
]

Итак, вот что делает иерархически организованные данные практически сущностями первого класса в PartiQL:


  • Возможность указывать маршруты обхода во FROM, при этом они ведут себя вполне «таблично»: могут быть соединены и пр. Если, например, конец первого из двух записанных через запятую маршрутов совпадает с началом второго, это, по сути, JOIN по условию вложенности объектов.
  • Ключевое слово AT — в отличие, например, от тильды в JSONPath Plus — возвращает ключи «в привязке» к значениям, то есть практически отношение в смысле реляционной модели.

В принципе, это всё, что нужно знать о PartiQL, если есть возможность немного доразобрать ответ на клиенте. Если хочется поупражняться в конструировании JSON и выворачивании его наизнанку на стороне сервера, есть PIVOT (работает похоже на сводные таблицы в Excel), UNPIVOT и GROUP AS.

Может возникнуть вопрос:, но ведь эти JSON-данные бессхемны, в различных кортежах по одному ключу могут быть доступны данные различной структуры. Если данные не совсем совпадают с их схемой в голове, PartiQL возвращает значение MISSING. Это такой альтернативный NULL. Но можно и явно проверять, с чем имеешь дело, с помощью CASE WHEN cafe IS TUPLE … и т. п.


Что дальше?

На наших глазах происходит конвергенция сервисов хранения данных. Что нас ждет в финале? Вероятно, полная их конвергентность. Этому есть и теоретическое обоснование, и эмпирическое.

Использование нескольких облачных сервисов хранения данных — тоже polyglot persistence, пусть и в облачном варианте. Однако известно, что на смену polyglot persistence идет мультимодельность. Что даст клиентам облачного провайдера облачная версия мультимодельности?


  • Безопасность. Необходимость управлять пользователями сразу нескольких хранилищ повышает риск ошибки, чему, вероятно, служит подтверждением инцидент с утечкой данных Capital One.
  • Транзакционность, которая в гетерогенной среде проблематична, но которую хотелось бы иметь в связи со всеобщим движением от OLAP к HTAP.

В маркетинге DataStax это называются single entry point и right-now economy соответственно, однако о чем DataStax умалчивает — это о том, что мультимодельность выгодна не только клиенту сервиса, но и поставщику. Обеспечение enterprise-характеристик сервиса хранения, пусть эта задача в облаке и автоматизирована в значительной степени, всё же легче для одного сервиса, чем для нескольких. That would save you a lot of money, Mr. Bezos, please call me.

Ну, а эмпирическим подтверждением того, что направление движения — мультимодельность, является лучшая её поддержка основном конкурентом — Azure, который второй год подряд опережает AWS по объему выручки (и вдумчивым ответ на имеющийся в котором U-SQL является PartiQL). В самом деле:


  • если говорить о мультимодельных СУБД прежнего типа, основанных на реляционной модели, Amazon Aurora явно уступает Azure SQL Database, не имея поддержки графовой модели;
  • сравнить мультимодельные СУБД нового типа (подобные ArangoDB и OrientDB) не получится вовсе: никакого аналога Azure CosmosDB в составе AWS нет.

Итак, хочется, чтобы абстрактная модель данных PartiQL поскорее стала конкретной: неким аналогом ASR из Azure CosmosDB, и в AWS появилось соответствующее хранилище. А пока можно поиграться с альфа-версией эталонной реализации PartiQL на Kotlin.


Ссылки


Похожие новости

Седьмого августа вышел релиз седьмой версии флагманского RDF-хранилища Stardog. Написав адаптеры ко всему на свете, создатели теперь заявляют: «data location is almost always irrelevant».


Релевантные фрагменты моих предыдущих публикаций


P.S. Спасибо JBL за наводку на оригинальный пост в блоге AWS Open Source.

© Habrahabr.ru