t1 в MongoDB для отслеживания заказов клиентов:
t1 в ClickHouse будет содержаться следующая строка:
Схема таблицы
_id: Первичный ключ из MongoDBdoc: Документ MongoDB, реплицированный в типе данных JSON_peerdb_synced_at: Указывает, когда строка была синхронизирована в последний раз_peerdb_version: Отслеживает версию строки; увеличивается при обновлении или удалении строки_peerdb_is_deleted: Указывает, удалена ли строка
Движок таблицы ReplacingMergeTree
ReplacingMergeTree. В этом движке обновления представляются как вставки более новой версии (_peerdb_version) документа для данного первичного ключа (_id), что позволяет эффективно обрабатывать обновления, замены и удаления как версионированные вставки.
ReplacingMergeTree удаляет дубликаты асинхронно в фоновом режиме. Чтобы гарантировать отсутствие дубликатов для одной и той же строки, используйте модификатор FINAL. Например:
Обработка удалений
_peerdb_is_deleted. Обычно такие строки исключают с помощью фильтра в запросах:
Запросы к данным JSON
Query
Result
^:
Query
Result
Тип Dynamic
Dynamic. Тип Dynamic позволяет ClickHouse хранить значения любых типов, не зная тип заранее. Это можно проверить с помощью функции toTypeName:
Query
Result
dynamicType. Обратите внимание: у одного и того же имени поля в разных строках могут быть разные типы данных:
Query
Result
Query
Result
Query
Result
Query
Result
Приведение типов полей
sum непосредственно к типу Dynamic, возникнет следующая ошибка:
CAST или синтаксиса :::
Query
Result
Приведение из типа Dynamic к базовому типу данных (определяемому с помощью
dynamicType) выполняется очень быстро, поскольку ClickHouse уже хранит значение внутри в этом базовом типе.Преобразование JSON в плоский вид
Обычное представление
Refreshable materialized view
FINAL выполняется только один раз — во время обновления, поэтому в последующих запросах к целевой таблице использовать FINAL уже не нужно.
Недостаток в том, что данные в целевой таблице остаются актуальными лишь до степени, соответствующей времени последнего обновления. Во многих сценариях интервалы обновления от нескольких минут до нескольких часов обеспечивают хороший баланс между актуальностью данных и производительностью запросов.
flattened_t1 напрямую, без модификатора FINAL:
Incremental materialized view
FINAL в materialized view, так как каждое обновление будет запускать слияние. Вместо этого дедупликацию данных можно выполнять во время выполнения запроса, создав обычное представление поверх materialized view.
flattened_t1_final следующим образом: