view.
Есть две таблицы (table_a и table_b).
Мне надо выполнить их слияние (JOIN) и результат сохранить в промежуточную таблицу, в которой будут только "свежие" данные в рамках суток (TTL по времени вставки данных).
Я предполагаю что можно над этими двумя таблицами накрутить две mat view с TTL по времени вставки данных,
в каждой из которых мы берем измененные данные,
делаем left JOIN другой таблицы
и грузим в AggregatingMergeTree движок,
где делаем слияние изменяющихся полей. Вроде бы тема такая работает, но я получаю не ожидаемый результат (часть данных отсутствует)
Вот вопрос, такой подход полная шляпа и я что-то концептуально не так делаю или просто у меня косяк в бизнес логике имеется, что данные не все долетают до целевой таблицы?
не совсем понял, у вас на каждой из таблиц по триггеру, каждый из которых сливает в одну и ту же третью таблицу? а где именно тогда указан "TTL по времени вставки данных"
вообще для движка с отсутствием очередей транзакций и уровнем изоляции чтений а-ля "read uncommitted" такие взаимные джойны видятся рискованной затеей по описанию задачи больше на что-то типа live view похоже
да, сливает в одну таблицу с аггрегационным движком , на которой висит TTL на время вставки данных (Default now)
похоже на то, что фича экспериментальная ведь)
Если вы уже дошли до AggregatingMT, то зачем вам джойны? Делайте Nullable поля и грузите из каждой таблицы независимо. Для более сложных вариантов можно поиграться с SimpleAggregatingFunction - max, argMax, any и проч.
ну это справедливо, но даже при left JOIN у меня не должны данные попадать, которые с правой таблицей объединиться не смогли и все поля, кроме участвующих в order by, я указал как AggregatingFunction
у меня есть гипотеза, что в AggregatingMergeTree движке при указании TTL поля с дефолтным значением NOW подчищаются данные, которые не должны удаляться и из-за этого результат аггрегации выходит неожидаемым
не должны, но ошибиться можно много где. Я хотел сказать что без join тут скорее всего можно обойтись и это будет явно правильнее. И по мере возможности надо заменить AggregatingFunction на SimpleAggregatingFunction
ну да, согласен с вами, попробую действительно JOIN убрать, так как в данном движке данные все равно схлопнутся
Откуда у вас дефолты вообще? У вас в мат вью все поля заполняются наверное
нет, у меня в аггрерационной таблице указано так create table if not exists schema.agg_table on cluster test ( ... processed_dttm DateTime DEFAULT NOW() ) ENGINE = ReplicatedAggregatingMergeTree() а в мат вью я это поле не заполняю прост
не заполняю или не заполняю в секции полей в мат вью это поле определено?
нет, в мат вью не указано
значит оно заполняется now вы можете отключить TTL мержи временно (system stop ttl merges) и выключить optimize_on_insert и посмотреть будут исчезать или нет
ну вот про now я знаю, как раз пробую убрать ttl вообще и понаблюдать за рассчетом
Обсуждают сегодня