Вы управляете строкой в ​​Clickhouse? - PullRequest
1 голос
/ 13 марта 2020

Я пытаюсь загрузить JSON данные из Кафки в Clickhouse, где JSON содержит несколько escape-последовательностей. Например:

:) SELECT JSONExtractRaw('{"message": "Hello \"to\" you!"}', 'message')

SELECT JSONExtractRaw('{"message": "Hello "to" you!"}', 'message')

┌─JSONExtractRaw('{"message": "Hello "to" you!"}', 'message')─┐
│ "Hello "                                                    │
└─────────────────────────────────────────────────────────────┘

Похоже, что перед вызовом JSONExtractRaw входные строки не экранированы, что приводит к неверному JSON. Эскейпинг кажется воспроизводимым на этом минимальном примере:

:) SELECT 'Hello \"there\"'

SELECT 'Hello "there"'

┌─'Hello "there"'─┐
│ Hello "there"   │
└─────────────────┘

Мне интересно, возможно ли сохранить исходное (экранированное) представление ввода.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 13 марта 2020

Давайте проверим ваш случай без CLI, чтобы эмулировать таблицу, заполненную данными, поступающими извне:

echo '{"message": "Hello \"to\" you!"}' | clickhouse-client \
    --password 12345 \
    --query="INSERT INTO test.json_001 SELECT json FROM input('json String') FORMAT CSV"
create database test;    
create table test.json_001 (json String) Engine=Memory; 

Получить необходимые данные:

clickhouse-client \
    --password 12345 \
    --query="SELECT JSONExtractRaw(json, 'message'), JSONExtractString(json, 'message') FROM test.json_001"

# result:
# "Hello \\"to\\" you!"   Hello "to" you!
SELECT
    JSONExtractRaw(json, 'message'),
    JSONExtractString(json, 'message')
FROM test.json_001

/* result
┌─JSONExtractRaw(json, 'message')─┬─JSONExtractString(json, 'message')─┐
│ "Hello \"to\" you!"             │ Hello "to" you!                    │
└─────────────────────────────────┴────────────────────────────────────┘
*/

Работает как должно. Я не вижу никаких проблем.

0 голосов
/ 13 марта 2020
SELECT '{"message": "Hello \\"to\\" you!"}'

┌─'{"message": "Hello \\"to\\" you!"}'─┐
│ {"message": "Hello \"to\" you!"}     │
└──────────────────────────────────────┘
...