Что делать, если сильно хочется DELETE?

1,072 views
Skip to first unread message

Никита

unread,
Nov 15, 2016, 8:08:27 AM11/15/16
to ClickHouse
Очень хочется иметь операцию DELETE, как минимум, для следующих двух юзкейсов.

1) Нужно хранить данные за нецелое число месяцев. К примеру, только за две недели. Хочется удалять каждый день самый старый день.
2) Нужно импортировать данные целиком за день. Есть вероятность, что в результате каких-либо неполадок вставка выполнится частично и прервется. Транзакций в ClickHouse нет. Было бы неплохо иметь возможность просто удалить все, что успело вставиться за этот день, и импортировать его снова.

Во втором случае, конечно, можно навернуть какую-то реализацию транзакций на стороне приложения - вставлять маленькими кусочками, следить, что именно вставилось. А в первом? Есть ли какой-нибудь воркэраунд, позволяющий реализовать желаемое?

tatiana....@revjet.com

unread,
Nov 15, 2016, 11:04:05 AM11/15/16
to ClickHouse
Когда нам очень хотелось удалять по дням, мы добавили в таблицу еще одно поле с датой.
Чтобы сделать ее уникальной, из года вычитается номер дня в месяце.
Например,  для 2016-11-15 получится 2001-11-15 ((2016-15)-11-15)

CREATE TABLE table_name
(
    file_date Date,
...
    part_date Date
) ENGINE = MergeTree(part_date, (file_date), 8192);

# Extract the number of day
years=`date -d $filedate +%d`
# Subtract a few years from the date
partdate=`date -d "$filedate -$years years" +%Y-%m-%d`

man...@gmail.com

unread,
Nov 15, 2016, 9:33:14 PM11/15/16
to ClickHouse
Вторая проблема решена при использовании Replicated-таблиц.
Цитата из документации:

Блоки данных дедублицируются. При многократной записи одного и того же блока данных (блоков данных одинакового размера, содержащих одни и те же строчки в одном и том же порядке), блок будет записан только один раз. Это сделано для того, чтобы в случае сбоя в сети, когда клиентское приложение не может понять, были ли данные записаны в БД, можно было просто повторить запрос INSERT. При этом не имеет значения, на какую реплику будут отправлены INSERT-ы с одинаковыми данными. То есть, обеспечивается идемпотентность INSERT-ов. Это работает только для последних 100 вставленных в таблицу блоков.

То есть, для надёжной загрузки данных при наличии сбоев, необходимо:
- использовать Replicated-таблицы.
- иметь возможность повторить вставку в точности того же блока данных в случае сбоя.

man...@gmail.com

unread,
Nov 15, 2016, 9:36:10 PM11/15/16
to ClickHouse
У нас есть задача "партиционирование по произвольному ключу". Потребность действительно очень высокая, мы постараемся реализовать это как можно раньше.

Чтобы хранить данные за две недели, сейчас можно использовать отдельные таблицы для каждого дня.
Работать с множеством таблиц можно как с одной таблицей, если создать поверх них таблицу типа Merge.
https://clickhouse.yandex/reference_ru.html#Merge

Но не нужно делать большое количество отдельных таблиц.

man...@gmail.com

unread,
Nov 15, 2016, 9:38:09 PM11/15/16
to ClickHouse


вторник, 15 ноября 2016 г., 19:04:05 UTC+3 пользователь tatiana....@revjet.com написал:
Когда нам очень хотелось удалять по дням, мы добавили в таблицу еще одно поле с датой.
Чтобы сделать ее уникальной, из года вычитается номер дня в месяце.
Например,  для 2016-11-15 получится 2001-11-15 ((2016-15)-11-15)


Изобретательно.
Жаль, что сейчас приходится использовать такие обходные пути.
Reply all
Reply to author
Forward
0 new messages