сагрегировать данные каждом шарде и уникализировать эти агрегаты во всем кластере.
Раньше была старая версия clickhouse 1.1*
И на нем проблема решалась примерно так. На каждом шарде делалась агрегация такого вида.
select * from (
select *, hostName() as hostname from distributed_table
limit 1 by unique_key
) where hostname = hostName()
После обновления на версию 19.16.14.65 этот подход перестал работать, из-за того, что появилась вероятность того, что вложенный и наружний запросы стали выполняться на разных репликах одного шарда. Соответственно стала возвращаться пустота т к hostName() никогда не совпадут (тут я очень сильно удивился, т к prefer_localhost_replica=1 не помог, может есть способ строго зафиксировать реплику?)
Появилось желание переделать c hostName() на shard_num из system.clusters, для этого делаю join этой таблицы.
виртуального _shard_num нет еще в нашей версии.
>появилась вероятность того, что вложенный и наружний >запросы стали выполняться на разных репликах одного шарда конечно нет. Вообще все не так и в 1.1* и в 19.16. Внешний запрос всегда выполняется и всегда выполнялся на инициаторе и там был hostName() инициатора. >Есть неуникальные данные которые размазаны по шардам рандомно. ну у всех так, это типовая ситуация >Задача - сагрегировать данные каждом шарде и >уникализировать эти агрегаты во всем кластере. Что??????? почему просто select * from distributed_table limit 1 by unique_key не подходит?
Обсуждают сегодня