Size: a a a

ClickHouse не тормозит

2020 June 26

TP

Timur Polukeev in ClickHouse не тормозит
Добрый день, коллеги. Прошу совета у коллективного разума для решения следующей задачи.
Имеется таблица:

CREATE TABLE events (
 event_time DateTime,
 event_id UUID,
 country String,
 state String
) ENGINE = MergeTree()

Пускай в таблицу пишутся некие события, каждое со своим event_id и state=new. Также для некоторых событий приходят обновления значения state (например processing, rejected, approved и т.д.) и для сохранения этого факта в ту же таблицу записывается новая строка с ранее известным event_id (а также country), но свежим event_time и state. Таким образом для каждого уникального event_id актуальное значение state лежит в строке с максимальным event_time.

Требуется выполнить аналитический запрос и получить количество событий со state равным rejected и approved с группировкой по country. Первое, что приходит в голову:

SELECT
 country,
 sum(state='rejected') as rejected,
 sum(state='approved') as approved,
FROM (
 SELECT any(country) AS country, argMax(state, event_time) as state
 FROM events
 GROUP BY event_id
)
GROUP BY country


Но GROUP BY event_id не выглядит хорошим решением. Напрашивается использование ReplacingMergeTree, но он не даёт гарантии отсутствия дубликатов. Есть альтернативные способы построить подобный запрос? Или надо как-то менять структуру хранения событий?
источник

AP

Alexander Petrov in ClickHouse не тормозит
Rail
сейчас в миграциях указал первый под и все таблицы создались в первом поде, а ReplecatedMergeTree также появились в других подах и нет как раньше разброса таблиц kafka engine, consumer MV по всем подам.
Если запущу во всех подах миграции, то видимо kafka engine, consumer MV тоже продублируются и будет ок
Можно наверное какой-нибудь kubernates job приделать чтоб он на всех подах запускал миграции
источник

AK

Andrew Kochen in ClickHouse не тормозит
Timur Polukeev
Добрый день, коллеги. Прошу совета у коллективного разума для решения следующей задачи.
Имеется таблица:

CREATE TABLE events (
 event_time DateTime,
 event_id UUID,
 country String,
 state String
) ENGINE = MergeTree()

Пускай в таблицу пишутся некие события, каждое со своим event_id и state=new. Также для некоторых событий приходят обновления значения state (например processing, rejected, approved и т.д.) и для сохранения этого факта в ту же таблицу записывается новая строка с ранее известным event_id (а также country), но свежим event_time и state. Таким образом для каждого уникального event_id актуальное значение state лежит в строке с максимальным event_time.

Требуется выполнить аналитический запрос и получить количество событий со state равным rejected и approved с группировкой по country. Первое, что приходит в голову:

SELECT
 country,
 sum(state='rejected') as rejected,
 sum(state='approved') as approved,
FROM (
 SELECT any(country) AS country, argMax(state, event_time) as state
 FROM events
 GROUP BY event_id
)
GROUP BY country


Но GROUP BY event_id не выглядит хорошим решением. Напрашивается использование ReplacingMergeTree, но он не даёт гарантии отсутствия дубликатов. Есть альтернативные способы построить подобный запрос? Или надо как-то менять структуру хранения событий?
ReplacingMergeTree и запрос SELECT ... FINAL ?
источник

TP

Timur Polukeev in ClickHouse не тормозит
Andrew Kochen
ReplacingMergeTree и запрос SELECT ... FINAL ?
Если я правильно понял, документация советует избегать использование FINAL
источник

AB

Andrey Bobelev in ClickHouse не тормозит
Привет, при апгрейде с 19.13.3.26 до 20.3.11.97 очень много такого
Таблицы локальные MergeTree, не реплицируемые

https://pastebin.vkpartner.ru/raw/ergJ5aIZb0VAU5vhlmIoQ4CydHWzNksGJDobibwdEsvqRwsEdXvSPgpZ78DQc4xh8Nx2oRL3VoUkhTa8
источник

AB

Andrey Bobelev in ClickHouse не тормозит
После 10 минут попытки запуска оно падает c ошибкой Suspiciously many (38) broken parts to remove.
источник

Н

Николай in ClickHouse не тормозит
Timur Polukeev
Добрый день, коллеги. Прошу совета у коллективного разума для решения следующей задачи.
Имеется таблица:

CREATE TABLE events (
 event_time DateTime,
 event_id UUID,
 country String,
 state String
) ENGINE = MergeTree()

Пускай в таблицу пишутся некие события, каждое со своим event_id и state=new. Также для некоторых событий приходят обновления значения state (например processing, rejected, approved и т.д.) и для сохранения этого факта в ту же таблицу записывается новая строка с ранее известным event_id (а также country), но свежим event_time и state. Таким образом для каждого уникального event_id актуальное значение state лежит в строке с максимальным event_time.

Требуется выполнить аналитический запрос и получить количество событий со state равным rejected и approved с группировкой по country. Первое, что приходит в голову:

SELECT
 country,
 sum(state='rejected') as rejected,
 sum(state='approved') as approved,
FROM (
 SELECT any(country) AS country, argMax(state, event_time) as state
 FROM events
 GROUP BY event_id
)
GROUP BY country


Но GROUP BY event_id не выглядит хорошим решением. Напрашивается использование ReplacingMergeTree, но он не даёт гарантии отсутствия дубликатов. Есть альтернативные способы построить подобный запрос? Или надо как-то менять структуру хранения событий?
Есть специальный движок для возможных обновлений
источник

Н

Николай in ClickHouse не тормозит
Забыл как называется)
источник

Н

Николай in ClickHouse не тормозит
Timur Polukeev
Добрый день, коллеги. Прошу совета у коллективного разума для решения следующей задачи.
Имеется таблица:

CREATE TABLE events (
 event_time DateTime,
 event_id UUID,
 country String,
 state String
) ENGINE = MergeTree()

Пускай в таблицу пишутся некие события, каждое со своим event_id и state=new. Также для некоторых событий приходят обновления значения state (например processing, rejected, approved и т.д.) и для сохранения этого факта в ту же таблицу записывается новая строка с ранее известным event_id (а также country), но свежим event_time и state. Таким образом для каждого уникального event_id актуальное значение state лежит в строке с максимальным event_time.

Требуется выполнить аналитический запрос и получить количество событий со state равным rejected и approved с группировкой по country. Первое, что приходит в голову:

SELECT
 country,
 sum(state='rejected') as rejected,
 sum(state='approved') as approved,
FROM (
 SELECT any(country) AS country, argMax(state, event_time) as state
 FROM events
 GROUP BY event_id
)
GROUP BY country


Но GROUP BY event_id не выглядит хорошим решением. Напрашивается использование ReplacingMergeTree, но он не даёт гарантии отсутствия дубликатов. Есть альтернативные способы построить подобный запрос? Или надо как-то менять структуру хранения событий?
источник

Н

Николай in ClickHouse не тормозит
Посмотри, может тебе подойдёт для твоей задачи
источник

AP

Alexander Petrov in ClickHouse не тормозит
В итоге запрос станет проще ага:
select
   country,
   state,
   sum(sign) as events_count
from events
group by country, state
Но вставка станет кудрявее. Для каждого нового состояния надо будет вставить ещё и отмену предыдущего. А если порядок вставки не гарантируется, то надо юзать VersionedCollapsingMergeTree. Там ещё версия добавляется.
источник

AP

Alexander Petrov in ClickHouse не тормозит
А если таблица используется не только для этого, не факт что остальные запросы получится переписать под такую схему без последствий.
источник

AR

Alexander Ryzhenko in ClickHouse не тормозит
Доброго всем. Я уже задавал этот вопрос пару дней назад, но все же.

Есть таблица
data_lake (
order_id nullable(int32),
order_date nullable(datetime)
order_product_id nullable(int32)
order_product_price nullable(decimal)
)

Есть 2 таблицы с engine kafka (для order и для order_product)
и 2 матвьюхи (консюмеры из кафки в таблицу data_lake). В консюмере я перечисляю только те поля, которые есть в соответствующем кафка топике.

Почему при вычитывании из кафки я получаю ошибки
<Error> void DB::StorageKafka::threadFunc(): Code: 8, e.displayText() = DB::Exception: Cannot find column `order_id` in source stream: while pushing to view streams.order_product_consumer

На тестовом сервер работало нормально. Версия 19.15.3.6
Может есть настройка какая, которая требует строгого перечисления ВСЕХ полей?
источник

AF

Anton Farygin in ClickHouse не тормозит
Alexander Petrov
В итоге запрос станет проще ага:
select
   country,
   state,
   sum(sign) as events_count
from events
group by country, state
Но вставка станет кудрявее. Для каждого нового состояния надо будет вставить ещё и отмену предыдущего. А если порядок вставки не гарантируется, то надо юзать VersionedCollapsingMergeTree. Там ещё версия добавляется.
Добрый день! А тоже самое, интересно, сделать в MV можно каким-то образом ? У меня тоже есть похожая задача, но хотелось бы её полностью отдать на базу.
источник

SC

Smoked Cheese in ClickHouse не тормозит
Alexander Ryzhenko
Доброго всем. Я уже задавал этот вопрос пару дней назад, но все же.

Есть таблица
data_lake (
order_id nullable(int32),
order_date nullable(datetime)
order_product_id nullable(int32)
order_product_price nullable(decimal)
)

Есть 2 таблицы с engine kafka (для order и для order_product)
и 2 матвьюхи (консюмеры из кафки в таблицу data_lake). В консюмере я перечисляю только те поля, которые есть в соответствующем кафка топике.

Почему при вычитывании из кафки я получаю ошибки
<Error> void DB::StorageKafka::threadFunc(): Code: 8, e.displayText() = DB::Exception: Cannot find column `order_id` in source stream: while pushing to view streams.order_product_consumer

На тестовом сервер работало нормально. Версия 19.15.3.6
Может есть настройка какая, которая требует строгого перечисления ВСЕХ полей?
надо дефолты у таблицы проставить, даже если это NULL
источник

AR

Alexander Ryzhenko in ClickHouse не тормозит
Smoked Cheese
надо дефолты у таблицы проставить, даже если это NULL
прописаны дефолты вида
default CAST(NULL, 'Nullable(Int32)')
источник

AP

Alexander Petrov in ClickHouse не тормозит
Anton Farygin
Добрый день! А тоже самое, интересно, сделать в MV можно каким-то образом ? У меня тоже есть похожая задача, но хотелось бы её полностью отдать на базу.
Неа. В MV не получить предыдущие состояния выгружаемых строк. Это всё надо делать перед вставкой.
источник

AF

Anton Farygin in ClickHouse не тормозит
а если мы точно знаем, что предыдущее состояние строк нам не интересно и мы хотим его в любом случае заменить новым, при этом удалив некоторые из них ? Что то мне подсказывает что для этого надо какой-то другой движок использовать, а не CollapsingMergeTree.
источник

DT

Dmitry Titov in ClickHouse не тормозит
ReplacingMergeTree
источник

AP

Alexander Petrov in ClickHouse не тормозит
Dmitry Titov
ReplacingMergeTree
не удалит строки
источник