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 может:
Пользователи могут использовать тип varchar в ksqlDB для столбцов, которые, как известно, имеют формат JSON. Строка в формате JSON также может быть вложена в карту или структуру.
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_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_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_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 )