Я хочу создать таблицу с фиксированным количеством строк (скажем, N), где, если добавлена N + 1-я строка, тогда 1-я строка будет удалена.Cassandra: Исправлено количество строк в таблице
Это таблица, я использую для хранения последних N лучших результатов анализа графика:
CREATE TABLE IF NOT EXISTS lp_registry.best (
value float, // best value for current graph
verts int, // number of vertices in graph
edges int, // number of edges in graph
wid text, // worker id
id timeuuid, // timeuuid
PRIMARY KEY (wid, id)
) WITH CLUSTERING ORDER BY (id ASC);
Я читал о expiring data at DataStax, но нашел только TTL истечение срока. Поэтому я решил сделать это следующим образом.
Мой подход:
Everytime новый результат хотел добавить, идентификатор старейшей строки извлекается ..
SELECT wid, id FROM lp_registry.best LIMIT 1;
..as также текущее число строк ..
SELECT COUNT(*) FROM FROM lp_registry.best;
Следовательно, если число> = N, то самая старая строка удаляется, а новейший добавляются ...
BEGIN BATCH
INSERT INTO lp_registry.best (value, verts, edges, wid, id) VALUES (?, ?, ?, ? now());
DELETE FROM lp_registry.best WHERE wid = ? AND id = ?;
APPLY BATCH;
Этот подход имеет проблему с тем, что первые селекции не являются атомарными операциями вместе со следующей партией. Поэтому, если какой-либо другой рабочий удалил старую строку между select и batch или N был превышен, это не сработает.
Мой подход B:
Те же первые шаги ...
SELECT wid, id FROM lp_registry.best LIMIT 1;
SELECT COUNT(*) FROM FROM lp_registry.best;
Затем попытайтесь не удалить старую строку снова и снова, пока успех ..
if count < N {
INSERT INTO lp_registry.best (value, verts, edges, wid, id) VALUES (?, ?, ?, ? now());
} else {
while not success {
DELETE FROM lp_registry.best WHERE wid = ? AND id = ? IF EXISTS;
}
INSERT INTO lp_registry.best (value, verts, edges, wid, id) VALUES (?, ?, ?, ? now());
}
В этом подходе все еще есть проблемы с превышением N в базе данных, прежде чем подсчет < N проверяется.
Можете ли вы указать мне правильное решение?
Один простой вопрос: зачем вам это нужно? Возможно, другой подход - лучший вариант для вашего случая использования. –
Существует много параллельных компьютеров (рабочих), каждый из которых выполняет одинаковые вычисления для разных данных, а время вычисления сильно варьируется. Затем существует логика верхнего уровня, которая принимает N последних результатов и выполняет вычисления с ней. – Michal