Игнорирование повторяющихся значений ключа

807 views
Skip to first unread message

Родион Горбачев

unread,
Jan 25, 2017, 7:00:25 AM1/25/17
to ClickHouse
Доброго дня.
Вопрос - как при вставке значений в таблицу с движком MergeTree(??) игнорировать повторяющиеся значения ?
Допустим . есть таблица 
create table SOP
(
 sop_chg_id
Int64  
 
, dt DateTime
 
, dt_date  Date
) ENGINE = MergeTree(dt_date, (sop_chg_id), 8192)
в которую с периодичностью ~ 1 мин заливаются порядка 15тыс строк (в таблице ~5 млрд записей).
Часть строк - дубликаты.
Как от них избавиться ? 



Хрячок Хрячков

unread,
Jan 25, 2017, 8:51:00 AM1/25/17
to ClickHouse
Здравствуйте.

Я использую для такой же задачи два варианта:

1. Лить в промежуточную таблицу, из нее потом переносить данные в основную без дубликатов, типа
INSERT INTO SOP SELECT * FROM SOP_temp GROUP BY sop_chg_id, dt, dt_date

2. Использовать движок ReplacingMergeTree, который схлопывает данные по ключу, подробности в поиске можно найти.

среда, 25 января 2017 г., 15:00:25 UTC+3 пользователь Родион Горбачев написал:

Родион Горбачев

unread,
Jan 25, 2017, 10:23:21 AM1/25/17
to ClickHouse
Вот вариант с ReplacingMergeTree очень интересный - уже тоже на него наткнулся.
Смущает только что он пока не документирован. Возможно его и использовать пока нельзя.
Но работает как то интересно. Данные схлопываются с небольшой задержкой (2 загрузки идентичных данных по 10 млн строк и 10 столбцов схлопывались около 10 минут - на довольно слабом железе - 32Гб+4 проц.
И еще - как-то странно ведет себя таблица system.parts// Количество секций плавает : )
Пытался использовать ее для OPTIMIZE TABLE .. PARTITION x


среда, 25 января 2017 г., 16:51:00 UTC+3 пользователь Хрячок Хрячков написал:

man...@gmail.com

unread,
Jan 26, 2017, 3:58:11 PM1/26/17
to ClickHouse
Таблица типа RepliacingMergeTree - стабильная функциональность, используемая в продакшене.

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

В таблице system.parts отображаются как активные партиции (которые используются для чтения), так и старые партиции, оставшиеся после слияния (такие удаляются через несколько минут).
Чтобы показать только активные партиции, нужно написать WHERE active.

Для того, чтобы выполнить слияние побыстрее, можно использовать OPTIMIZE. Но вызывать каждый раз OPTIMIZE будет очень неоптимально.
Также есть вариант, использовать модификатор FINAL во FROM - он вызывает, по сути, слияние данных при чтении - это тоже работает неэффективно.
Reply all
Reply to author
Forward
0 new messages