1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/mirrors-KSQL

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
klip-59-json-functions.md 9.5 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 28.11.2024 07:33 e6dfb69

KLIP-59 — функции JSON

Авторы: Александр Сорокоумов (@gerrrr), Колин Хикс (@colinhicks) Целевая версия выпуска: 0.24.0; 7.2.0 | Статус: объединено | Обсуждение: GitHub PR

Мотивация и предпосылки

Многие пользователи ksqlDB используют JSON. ETL-конвейеры часто работают с большими JSON-объектами, например, из MongoDB. Как де-факто формат интернета, он часто является форматом аналитических событий, отправляемых в Kafka, а также выбором для материализованных представлений, используемых веб-приложениями.

Мы хотим позиционировать ksqlDB как дружественную к JSON базу данных. Поддержка чтения, записи и перемещения данных в формате JSON представляет собой важное преимущество. И пользователи традиционных баз данных, таких как PostgreSQL, уже пользуются мощной поддержкой JSON.

Сегодня ksqlDB может:

  • Читать ключи и значения в формате JSON во входных записях.
  • Сериализовать ключи и значения как JSON в выходных записях.
  • Извлекать строковое значение по заданному пути JSON.

Что входит в рамки проекта

  • Проверять, содержит ли данная строка значение JSON
  • Вычислять длину массива JSON, закодированного в строке
  • Извлекать ключи и записи из заданной строки в формате JSON
  • Объединять строки в формате JSON
  • Преобразовывать запись ksqlDB в строку в формате JSON

Что не входит в рамки проекта

  • Тип данных JSON
  • Поддержка двоичного JSON

Публичные API

Пользователи могут использовать тип varchar в ksqlDB для столбцов, которые, как известно, имеют формат JSON. Строка в формате JSON также может быть вложена в карту или структуру.

is_json_string

is_json_string(json_string) -> Boolean

Для данной строки возвращает true, если она может быть проанализирована как допустимое значение JSON, false в противном случае.

Примеры

is_json_string("[1, 2, 3]") // возвращает true
is_json_string("{}") // возвращает true
is_json_string("1") // возвращает true
is_json_string("\"abc\"") // возвращает true
is_json_string("null") // возвращает true
is_json_string("") // возвращает false
is_json_string("abc") // возвращает false
is_json_string(NULL) // возвращает false

json_array_length

json_array_length(json_string) -> Integer

Для заданной строки анализирует её как значение JSON и возвращает длину верхнего уровня массива. Возвращает NULL, если строка не может быть интерпретирована как массив JSON, то есть она NULL или не содержит допустимого JSON, или значение JSON не является массивом.

Примеры

json_array_length("[1, 2, 3]") // возвращает 3
json_array_length("[1, [1, [2]], 3]") // возвращает 3
json_array_length("[]") // возвращает 0
json_array_length("{}") // возвращает NULL
json_array_length("123") // возвращает NULL
json_array_length("abc") // возвращает NULL
json_array_length(NULL) // возвращает NULL

json_keys

json_keys(json_string) -> Array<String>

Для заданной строки анализирует её как объект JSON и возвращает массив строк ksqlDB, представляющих ключи верхнего уровня. Возвращает NULL, если строку нельзя интерпретировать как объект JSON, т. е. она NULL или не содержит допустимого JSON, либо значение JSON не является объектом.

Примеры

json_keys("{\"a\": \"abc\", \"b\": { \"c\": \"a\" }, \"d\": 1}") // возвращает ["a", "b", "d"]
json_keys("{}") // возвращает []
json_keys("[]") // возвращает NULL
json_keys("") // возвращает NULL
json_keys("123") // возвращает NULL
json_keys("abc") // возвращает NULL
json_keys(NULL) // возвращает NULL

json_records

json_records(json_string) -> Map<String, String>

Для заданной строки анализирует её как объект JSON и возвращает карту, представляющую ключи и значения верхнего уровня. Возвращает NULL, если строку невозможно интерпретировать как объект JSON, т.е. она NULL или не содержит допустимого JSON, либо значение JSON не является объектом.

Примеры

json_records("{\"a\": \"abc\", \"b\": { \"c\": \"a\" }, \"d\": 1}") // {"a": "\"abc\"", "b": "{ \"c\": \"a\" }", "d": "1"}
json_records("{}") // возвращает []
json_records("[]") // возвращает NULL
json_records("") // возвращает NULL
json_records("123") // возвращает NULL
json_records("abc") // возвращает NULL
json_records(NULL) // возвращает NULL

Отклоненные альтернативы

Убрать избыточные кавычки вокруг значений. Например:

json_records("{\"a\": \"abc\"}) // возвращает [["a", "abc"]]
``` «Типы данных»

to_json_string(NULL) // возвращает "null"


**Составные типы**

to_json_string(Array[1, 2, 3]) // возвращает "[1, 2, 3]" to_json_string(Struct{id=1,name=A}) // возвращает "{"id": 1, "name": "a"}" to_json_string(Map('c' := 2, 'd' := 4)) // возвращает "{"c": 2, "d": "4"}" to_json_string(Array[Struct{json_key=1 json_value=Map('c' := 2, 'd' := true)}]) // возвращает "[{"json_key": 1, "json_value": {"c": 2, "d": true}}]"


Пользовательские типы обрабатываются так же, как и типы, которые они обозначают.

#### Отклоненные альтернативы

Возвращает `NULL`, если на вход подаётся `NULL`. Хотя это может иметь смысл с точки зрения распространения `NULL`, существует несколько аргументов, почему мы должны сопоставить SQL `NULL` с JSON `null`:
* Подобно SQL `NULL`, JSON `null` является маркером отсутствующего значения, поэтому семантика не меняется.
* Возврат SQL `NULL` сделает невозможным сериализацию любого ввода в JSON `null`.

## Дизайн

Подобно существующим `EXTRACTJSONFIELD` и `JSON_ARRAY_CONTAINS`, общий рабочий процесс для всех функций заключается в анализе заданных строк в `JsonNode` Джексона и выполнении манипуляций в соответствии со спецификациями функций.

Этот подход может быть неоптимальным с точки зрения производительности, поскольку каждое обращение к функции полностью десериализует всю структуру и затем сериализует результат обратно. Однако лучшим вариантом для чувствительных к производительности манипуляций с JSON является введение собственных типов JSON, что позволяет полностью избежать этапа serde. В свою очередь, манипулирование строками легко реализовать, и оно позволяет использовать большинство распространённых вариантов использования.

## План тестирования

Добавить модульные тесты, QTT-тесты для новых функций.

## Обновление документации

Добавьте описание функций в [документацию скалярных функций](https://github.com/confluentinc/ksql/blob/master/docs/developer-guide/ksqldb-reference/scalar-functions.md).

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/mirrors-KSQL.git
git@api.gitlife.ru:oschina-mirror/mirrors-KSQL.git
oschina-mirror
mirrors-KSQL
mirrors-KSQL
master