Size: a a a

ClickHouse не тормозит

2020 July 13

DC

Denny Crane (I don't... in ClickHouse не тормозит
Alexander Zinoviev
Скиньте плз ссылку на сообщение, если уже было, не могу найти.

Вопрос такой: можно ли поменять Engine таблицы после того, как она была создана? Таблица(ы) создана с движком MergeTree, но данные приходят из Кафки и мы осознали, что иногда прилетают дубликаты, которые нам ну совершенно ненужны. И нужно заменить движок на ReplacingMergeTree.

Нигде не нашел доков по миграции engine
ну так и нет легального способа. Только хаки. Но надо знать что у вас было, что надо. И ReplacingMergeTree не панацея.
источник

DC

Denny Crane (I don't... in ClickHouse не тормозит
Dmitry Konovalchuk
правильно я понял, что если запрос отработал, то экспрешн меняется, ttl начинает работать по новой логике?
А show create таблицы просто не обновляется и не отображает изменения?
выполните у себя

CREATE TABLE example_table
(
   d DateTime,
   a Int
)
ENGINE = MergeTree
PARTITION BY toYYYYMM(d)
ORDER BY d
TTL d + INTERVAL 1 MONTH;


ALTER TABLE example_table MODIFY TTL d + INTERVAL 3 MONTH;

SHOW CREATE TABLE example_table

что показыает?
источник

DK

Dmitry Konovalchuk in ClickHouse не тормозит
Denny Crane (I don't work at Yandex (never did))
выполните у себя

CREATE TABLE example_table
(
   d DateTime,
   a Int
)
ENGINE = MergeTree
PARTITION BY toYYYYMM(d)
ORDER BY d
TTL d + INTERVAL 1 MONTH;


ALTER TABLE example_table MODIFY TTL d + INTERVAL 3 MONTH;

SHOW CREATE TABLE example_table

что показыает?
Так работает!

Но проблема что не работает на существующей таблице с данными (обычная ReplicatedMergeTree).

Upd. на MergeTree с данными все ок. Проблема только в Replicated.
источник

AZ

Alexander Zinoviev in ClickHouse не тормозит
Denny Crane (I don't work at Yandex (never did))
ну так и нет легального способа. Только хаки. Но надо знать что у вас было, что надо. И ReplacingMergeTree не панацея.
Печально. Какие-то идеи может есть как сделать дедупликацию данных? Или только данные тащить из старой таблицы в ново-созданную с типом ReplacingMergeTree?
источник

M

Max in ClickHouse не тормозит
Всем привет!

Подскажите, в чём может быть косяк при работе с ReplacingMergeTree и final

Исходная таблица:
create table tool.test
(
   date       Date,
   alias      String,
   count      Nullable(UInt32),
   updated_at DateTime
) engine = ReplacingMergeTree(date, (date, alias), 8192);


При запросе с final, всё ок:
select
   *
from
   test final
where
   date in ('2020-07-13', '2020-07-12', '2020-07-11')
   and alias = 'uniq1';


Но если сгенерировать диапазон дат и заджойнить ту же таблицу с final (аналогичный первому запрос):
select
   *
from
   (select toDate(now()) - (2 - number) as date FROM numbers(3)) t1
   left join test t2 final
       on t1.date = t2.date and t2.alias = 'uniq1';


То появляются дубликаты на последнюю дату, до тех пор пока clickhouse в фоне не схлопнет данные. group by не помогает
источник

DC

Denny Crane (I don't... in ClickHouse не тормозит
Dmitry Konovalchuk
Так работает!

Но проблема что не работает на существующей таблице с данными (обычная ReplicatedMergeTree).

Upd. на MergeTree с данными все ок. Проблема только в Replicated.
ааа replicated , это баг https://github.com/ClickHouse/ClickHouse/pull/5539
надо искать в ченжлоге куда вошел 5539
источник

DK

Dmitry Konovalchuk in ClickHouse не тормозит
Denny Crane (I don't work at Yandex (never did))
ааа replicated , это баг https://github.com/ClickHouse/ClickHouse/pull/5539
надо искать в ченжлоге куда вошел 5539
да, уже нагуглил issue)) спасибо огромное за помощь, до этого момента не знал, что проблема именно в replicated :)
источник

DC

Denny Crane (I don't... in ClickHouse не тормозит
Alexander Zinoviev
Печально. Какие-то идеи может есть как сделать дедупликацию данных? Или только данные тащить из старой таблицы в ново-созданную с типом ReplacingMergeTree?
полные дубликаты строк? если таблица маленькая то optimize table xxx final deduplicate

тащить или не тащить, вам решать. По сути данные на диске в партах одинакового формата, и можно переделать один движок в другой
источник

AZ

Alexander Zinoviev in ClickHouse не тормозит
Denny Crane (I don't work at Yandex (never did))
полные дубликаты строк? если таблица маленькая то optimize table xxx final deduplicate

тащить или не тащить, вам решать. По сути данные на диске в партах одинакового формата, и можно переделать один движок в другой
Да, строки - братья-близнецы. Таблица уже в сотни миллионов строк, Но она постоянно пополняемая. Поэтому придется запускать table xxx final deduplicate с какой-то периодичность.

А вот попробовать подключить парты к другому движку - интересная идея! Спасибо. Попробую поиграться (главное - случайно не уронить prod :)
источник

DC

Denny Crane (I don't... in ClickHouse не тормозит
Max
Всем привет!

Подскажите, в чём может быть косяк при работе с ReplacingMergeTree и final

Исходная таблица:
create table tool.test
(
   date       Date,
   alias      String,
   count      Nullable(UInt32),
   updated_at DateTime
) engine = ReplacingMergeTree(date, (date, alias), 8192);


При запросе с final, всё ок:
select
   *
from
   test final
where
   date in ('2020-07-13', '2020-07-12', '2020-07-11')
   and alias = 'uniq1';


Но если сгенерировать диапазон дат и заджойнить ту же таблицу с final (аналогичный первому запрос):
select
   *
from
   (select toDate(now()) - (2 - number) as date FROM numbers(3)) t1
   left join test t2 final
       on t1.date = t2.date and t2.alias = 'uniq1';


То появляются дубликаты на последнюю дату, до тех пор пока clickhouse в фоне не схлопнет данные. group by не помогает
какая версия КХ ? и почему tool.test в таком синтаксисе, что он не используется и не рекомендуется уже года 3
источник

n

naim in ClickHouse не тормозит
всем привет!
а как не добавляю настроек в файл конфигов включить логгирование  для другого пользоватедя и потом эти записи посмотреть в query_log ?
источник

M

Max in ClickHouse не тормозит
Denny Crane (I don't work at Yandex (never did))
какая версия КХ ? и почему tool.test в таком синтаксисе, что он не используется и не рекомендуется уже года 3
источник

DC

Denny Crane (I don't... in ClickHouse не тормозит
Alexander Zinoviev
Да, строки - братья-близнецы. Таблица уже в сотни миллионов строк, Но она постоянно пополняемая. Поэтому придется запускать table xxx final deduplicate с какой-то периодичность.

А вот попробовать подключить парты к другому движку - интересная идея! Спасибо. Попробую поиграться (главное - случайно не уронить prod :)
можно если partition by и order by совпадают, но проблема в том что у вас primary key уже должен быть подходящим.

переделать просто, freeze создает бесплатный бекап таблицы

останавливаем заливку.
создаем таблицу new
rename old to old_old, new to old
делаем alter table old_old freeze
муваем парты из shadow old_old в old/detached
атачим парты в old
включаем заливку

через неделю дропаем old_old
источник

M

Max in ClickHouse не тормозит
Denny Crane (I don't work at Yandex (never did))
какая версия КХ ? и почему tool.test в таком синтаксисе, что он не используется и не рекомендуется уже года 3
Исправил синтакс, но кажется это и не должно было повлиять на суть, final также выдает дубликаты.

create table tool.test
(
   date       Date,
   alias      String,
   count      Nullable(UInt32),
   updated_at DateTime
) engine = ReplacingMergeTree()
partition by date
order by (date, alias)
settings index_granularity = 8192;
источник

DC

Denny Crane (I don't... in ClickHouse не тормозит
не используйте старый синтаксис. Не надо.


а если сделать SEMI ?

select
   *
from
   (select toDate(now()) - (2 - number) as date FROM numbers(3)) t1
   left
SEMI join test t2
       on t1.date = t2.date and t2.alias = 'uniq1';



а если

select
   *
from
   (select toDate(now()) - (2 - number) as date FROM numbers(3)) t1
   left
join (select * from test where alias = 'uniq1' final) t2
       on t1.date = t2.date
;
источник

DC

Denny Crane (I don't... in ClickHouse не тормозит
если вам нужен джойн с календарем для заполнения 0 , то все проще и джойн не нужен, order by with fill
источник

S

Slach in ClickHouse не тормозит
Народ, я немного запутался. как через функции высшего порядка в clickhouse
из двух массивов сделать два столбца?

сейчас делаю
SELECT arrayJoin(label) AS __text, arrayJoin(value) AS __value
FROM (
 SELECT
    splitByChar(',', '1m,10m,30m,1h,6h,12h,1d,7d,14d,30d')                        AS label,
    splitByChar(',', '60,600,1800,3600,21600,43200,86400,604800,1209600,2592000') AS value
)

получаю декартово произведение
а надо чтобы просто был столбец __text и столбец __value
со значениями
1m , 60
10m, 600

и т.д.
источник

DC

Denny Crane (I don't... in ClickHouse не тормозит
Slach
Народ, я немного запутался. как через функции высшего порядка в clickhouse
из двух массивов сделать два столбца?

сейчас делаю
SELECT arrayJoin(label) AS __text, arrayJoin(value) AS __value
FROM (
 SELECT
    splitByChar(',', '1m,10m,30m,1h,6h,12h,1d,7d,14d,30d')                        AS label,
    splitByChar(',', '60,600,1800,3600,21600,43200,86400,604800,1209600,2592000') AS value
)

получаю декартово произведение
а надо чтобы просто был столбец __text и столбец __value
со значениями
1m , 60
10m, 600

и т.д.
или тупл или array join
источник

S

Slach in ClickHouse не тормозит
arrayMap((x, y) -> (x,y), label, value)
получу массив таплов
а потом из него что то типа
SELECT x.1 AS __text, x.2 AS __value ? Так?
источник

l

lnuynxa in ClickHouse не тормозит
Slach
arrayMap((x, y) -> (x,y), label, value)
получу массив таплов
а потом из него что то типа
SELECT x.1 AS __text, x.2 AS __value ? Так?
можно еще
arrayZip(label,value)
но зачем сжимать в туплы а потом обратно разворачивать в массивы?
источник