Работа с JSON в ClickHouse
Этот руководств предоставляет общие методы работы с данными JSON, реплицированными из MongoDB в ClickHouse с помощью ClickPipes.
Предположим, мы создали коллекцию t1
в MongoDB для отслеживания заказов клиентов:
Коннектор MongoDB CDC реплицирует документы MongoDB в ClickHouse с использованием нативного типа данных JSON. Реплицированная таблица t1
в ClickHouse будет содержать следующую строку:
Схема таблицы
Реплицированные таблицы используют эту стандартную схему:
_id
: Первичный ключ из MongoDBdoc
: Документ MongoDB, реплицированный как тип данных JSON_peerdb_synced_at
: Записывает, когда строка была в последний раз синхронизирована_peerdb_version
: Отслеживает версию строки; увеличивается при обновлении или удалении строки_peerdb_is_deleted
: Отмечает, была ли строка удалена
Движок таблиц ReplacingMergeTree
ClickPipes отображает коллекции MongoDB в ClickHouse, используя семейство движков таблиц ReplacingMergeTree
. С помощью этого движка обновления моделируются как вставки с более новой версией (_peerdb_version
) документа для данного первичного ключа (_id
), что позволяет эффективно обрабатывать обновления, замены и удаления как версионные вставки.
ReplacingMergeTree
асинхронно очищает дубликаты в фоновом режиме. Чтобы гарантировать отсутствие дубликатов для одной и той же строки, используйте модификатор FINAL
. Например:
Обработка удалений
Удаления из MongoDB передаются как новые строки, помеченные как удаленные с помощью столбца _peerdb_is_deleted
. Обычно вы хотите отфильтровать их в своих запросах:
Вы также можете создать политику на уровне строк, чтобы автоматически фильтровать удаленные строки, вместо того чтобы указывать фильтр в каждом запросе:
Запросы данных JSON
Вы можете напрямую запрашивать поля JSON, используя точечный синтаксис:
При запросе полей вложенных объектов с использованием точечного синтаксиса убедитесь, что вы добавили оператор ^
:
Динамический тип
В ClickHouse каждый столбец в JSON имеет динамический тип. Динамический тип позволяет ClickHouse хранить значения любого типа, не зная тип заранее. Вы можете проверить это с помощью функции toTypeName
:
Чтобы изучить подлежащие типы данных для столбца, вы можете проверить с помощью функции dynamicType
. Обратите внимание, что для одного и того же имени столбца в разных строках могут быть разные типы данных:
Регулярные функции работают с динамическим типом так же, как и с обычными столбцами:
Пример 1: Парсинг даты
Пример 2: Условная логика
Пример 3: Операции с массивами
Приведение типов полей
Агрегатные функции в ClickHouse не работают с динамическим типом напрямую. Например, если вы попробуете напрямую использовать функцию sum
на динамическом типе, вы получите следующую ошибку:
Чтобы использовать агрегатные функции, приведите поле к подходящему типу с помощью функции CAST
или синтаксиса ::
:
Приведение типов с динамического типа к подлежащему типу данных (определяемому dynamicType
) очень эффективно, так как ClickHouse уже хранит значение в своем подлежащем типе внутренне.
Преобразование JSON в плоский вид
Обычное представление
Вы можете создать обычные представления поверх таблицы JSON, чтобы инкапсулировать логику преобразования/приведения/трансформации для запроса данных, аналогично реляционной таблице. Обычные представления легковесны, так как они хранят только сам запрос, а не подлежащие данные. Например:
Это представление будет иметь следующую схему:
Теперь вы можете запрашивать представление аналогично тому, как запрашиваете плоскую таблицу:
Обновляемое материализованное представление
Вы можете создать Обновляемые материализованные представления, которые позволяют вам планировать выполнение запросов для дедупликации строк и хранения результатов в плоской целевой таблице. С каждой запланированной перезагрузкой целевая таблица заменяется последними результатами запроса.
Ключевым преимуществом этого метода является то, что запрос с использованием ключевого слова FINAL
выполняется только один раз во время обновления, устраняя необходимость в последующих запросах к целевой таблице с использованием FINAL
.
Недостатком является то, что данные в целевой таблице актуальны только на момент последнего обновления. Для многих случаев использования интервалы обновления от нескольких минут до нескольких часов обеспечивают хороший баланс между свежестью данных и производительностью запросов.
Теперь вы можете напрямую запрашивать таблицу flattened_t1
без модификатора FINAL
:
Инкрементное материализованное представление
Если вы хотите получить доступ к плоским столбцам в реальном времени, вы можете создать Инкрементные материализованные представления. Если ваша таблица имеет частые обновления, не рекомендуется использовать модификатор FINAL
в вашем материализованном представлении, так как каждое обновление запускает слияние. Вместо этого вы можете дедуплицировать данные во время запроса, создавая обычное представление поверх материализованного представления.
Теперь вы можете запрашивать представление flattened_t1_final
следующим образом: