Вопрос или проблема
У меня есть файл JSON, который я сохраняю в S3, структура выглядит следующим образом
{
"testing_field": "tambahan",
"test_update_2": {
"code_1": "5B72F80DA8",
"path_2": "xxx",
"filename_2": "xxx.pdf",
"qrcode_2": "xxx"
}
}
Сначала я попробовал функцию select, чтобы протестировать получение данных, вот так:
SELECT
test_update_2.filename_2
FROM s3(
'xxxx/sample_update_field.json',
'xxx',
'xxx'
)
Я получил результат, вот так:
xxx.pdf
xxx.pdf
После этого я создал новое поле в таблице, потому что я нашел и получил эти заметки
Вы не можете изменить имя колонки, добавляя точку (.) в имя колонки напрямую, потому что ClickHouse использует точку (.) как разделитель между именем базы данных и именем таблицы. Следовательно, использование точки в имени колонки вызовет конфликт с существующим синтаксисом.
Я сделал названия колонок следующим образом:
Выполняется запрос: ALTER TABLE sidebar_staging ADD COLUMN IF NOT EXISTS testing_field Nullable(String);
Выполняется запрос: ALTER TABLE sidebar_staging ADD COLUMN IF NOT EXISTS test_update_2_code_1 Nullable(String);
Выполняется запрос: ALTER TABLE sidebar_staging ADD COLUMN IF NOT EXISTS test_update_2_filename_2 Nullable(String);
Выполняется запрос: ALTER TABLE sidebar_staging ADD COLUMN IF NOT EXISTS test_update_2_path_2 Nullable(String);
Выполняется запрос: ALTER TABLE sidebar_staging ADD COLUMN IF NOT EXISTS test_update_2_qrcode_2 Nullable(String);
Я заменил (.) на (_)
Но когда я попытался вставить с помощью этого запроса:
INSERT INTO example_db.sidebar_staging (test_update_2_filename_2)
SELECT
test_update_2.filename_2
FROM s3(
'xxx/sample_update_field.json',
'xxx'
'xxx'
)
данные не были добавлены в целевое поле,
тогда я подумал, что мне нужно добавить псевдоним, и я попробовал этот запрос:
INSERT INTO example_db.sidebar_staging (test_update_2_filename_2)
SELECT
test_update_2.filename_2 as test_update_2_filename_2
FROM s3(
'xxx/sample_update_field.json',
'xxx'
'xxx'
)
но результат тот же, я думаю, мне нужно протестировать testing_field
, потому что она не в вложенном JSON, с помощью этого кода:
INSERT INTO example_db.sidebar_staging (testing_field)
SELECT
testing_field
FROM s3(
'xxx/sample_update_field.json',
'xxx',
'xxx'
)
Удивительно, что когда имя поля из JSON совпадает с именем поля в таблице, не требуется псевдоним, и оно может быть вставлено в целевую таблицу.
Потому что testing_field
совпадает с колонкой таблицы testing_field
Таким образом, вопрос в том, как выполнить вставку, если оригинальное поле находится во вложенном JSON?
Мне нужно извлекать с форматом точек (test update_2.filename 2
), чтобы получить значение,
с другой стороны, я не могу использовать точку в названии колонки и не могу использовать псевдоним для сопоставления с колонкой тоже
Ответ или решение
Чтобы вставить данные из вложенного JSON в ClickHouse, когда имена полей содержат точки, и вы не можете использовать точки в именах столбцов таблицы, необходимо правильно обработать структуру JSON и корректно сопоставить столбцы. Ваша текущая проблема связана с добавлением данных из вложенного JSON в таблицу, где имена столбцов изменены, чтобы избежать конфликтов с синтаксисом ClickHouse.
Вот несколько этапов и рекомендаций, которые помогут вам решить вашу задачу.
Шаг 1: Подготовка данных из JSON
Перед вставкой данных в таблицу вам нужно убедиться, что вы правильно извлекаете данные из JSON. Используйте JSONExtract
или JSONExtractString
для извлечения значений из вложенного JSON.
Пример запроса для извлечения значений из JSON может выглядеть следующим образом:
SELECT
JSONExtractString(testing_field, 'testing_field') AS testing_field,
JSONExtractString(JSONExtract(t, 'test_update_2'), 'code_1') AS test_update_2_code_1,
JSONExtractString(JSONExtract(t, 'test_update_2'), 'filename_2') AS test_update_2_filename_2,
JSONExtractString(JSONExtract(t, 'test_update_2'), 'path_2') AS test_update_2_path_2,
JSONExtractString(JSONExtract(t, 'test_update_2'), 'qrcode_2') AS test_update_2_qrcode_2
FROM s3('xxx/sample_update_field.json', 'xxx', 'xxx') AS t
Шаг 2: Вставка данных в таблицу
После того как вы корректно извлекли все необходимые данные, выполняйте вставку через ваш запрос, видоизменив его для вставки извлеченных значений.
INSERT INTO example_db.sidebar_staging (testing_field, test_update_2_code_1, test_update_2_filename_2, test_update_2_path_2, test_update_2_qrcode_2)
SELECT
JSONExtractString(t, 'testing_field') AS testing_field,
JSONExtractString(JSONExtract(t, 'test_update_2'), 'code_1') AS test_update_2_code_1,
JSONExtractString(JSONExtract(t, 'test_update_2'), 'filename_2') AS test_update_2_filename_2,
JSONExtractString(JSONExtract(t, 'test_update_2'), 'path_2') AS test_update_2_path_2,
JSONExtractString(JSONExtract(t, 'test_update_2'), 'qrcode_2') AS test_update_2_qrcode_2
FROM s3('xxx/sample_update_field.json', 'xxx', 'xxx') AS t
Шаг 3: Проверка результата
После выполнения запроса проверьте, были ли данные корректно вставлены в таблицу:
SELECT * FROM example_db.sidebar_staging LIMIT 10;
Итог
Таким образом, ключевым моментом является извлечение данных из вложенного JSON с использованием подходящих функций, таких как JSONExtract
и JSONExtractString
, а затем корректная вставка этих данных в заранее подготовленную таблицу, где имена столбцов были адаптированы для работы в ClickHouse.
Если у вас есть дальнейшие вопросы или понадобится помощь с другими аспектами работы с ClickHouse и JSON, не стесняйтесь спрашивать!