Cassandra:表中的固定行数
我想创建一个具有固定行数(比如N)的表,如果添加了N+1行,那么第一行将被删除 这是表格,我用于存储图形分析的最后N个最佳结果:Cassandra:表中的固定行数,cassandra,cassandra-2.2,Cassandra,Cassandra 2.2,我想创建一个具有固定行数(比如N)的表,如果添加了N+1行,那么第一行将被删除 这是表格,我用于存储图形分析的最后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 gra
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);
我读过,但只发现TTL过期。所以我决定按照下面的方法做
我的方法A:
每次需要添加新结果时,都会检索最旧行的id
SELECT wid, id FROM lp_registry.best LIMIT 1;
..以及当前行数
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());
}
如果计数
在这种方法中,在检查计数你能给我指出正确的解决方案吗?这是我的解决方案。首先,我们需要创建一个表来存储当前的行数
CREATE TABLE IF NOT EXISTS row_counter (
rmax int, // maximum allowed number of rows
rows int, // current number of rows
name text, // name of table
PRIMARY KEY (name)
);
然后为给定的固定行表初始化它:
INSERT INTO row_counter (name, rmax, rows)
VALUES ('best', 100, 0);
以下是以下代码中使用的语句:
q1 = "SELECT rows, rmax FROM row_counter WHERE name = 'best'";
q2 = "UPDATE row_counter SET rows = ? WHERE name = 'best' IF rows < ?";
q3 = "SELECT wid, id FROM best LIMIT 1";
q4 = "DELETE FROM best WHERE wid = ? AND id = ? IF EXISTS";
q5 = "INSERT INTO best (vertex, value, verts, edges, wid, id) VALUES (?, ?, ?, ?, ?, now())";
selectCounter = session.prepare(q1);
updateCounter = session.prepare(q2);
selectOldBest = session.prepare(q3);
deleteOldBest = session.prepare(q4);
insertNewBest = session.prepare(q5);
q1=“从行计数器中选择行,其中名称=‘最佳’”;
q2=“更新行\计数器设置行=?其中,如果行<?,名称='最佳'”;
q3=“从最佳限制1中选择wid、id”;
q4=“如果存在,从wid=?和id=?的最佳位置删除”;
q5=“插入最佳(顶点、值、顶点、边、wid、id)值(?,,,,,,,现在())”;
selectCounter=session.prepare(q1);
updateCounter=session.prepare(q2);
选择oldbest=session.prepare(第三季度);
deleteOldBest=session.prepare(第4季度);
insertNewBest=会话准备(q5);
Java解决方案:
// Success indicator
boolean succ = false;
// Get number of registered rows in the table with best results
Row row = session.execute(selectCounter.bind()).one();
int rows = row.getInt("rows") + 1;
int rmax = row.getInt("rmax");
// Repeatedly try to reserve empty space in table
while (!succ && rows <= rmax) {
succ = session.execute(updateCounter.bind(rows, Math.min(rows, rmax))).wasApplied();
rows = session.execute(selectCounter.bind()).one().getInt("rows") + 1;
}
// If there is not empty space in table, repeatedly try to make new empty space
while (!succ) {
row = session.execute(selectOldBest.bind()).one();
succ = session.execute(deleteOldBest.bind(row.getString("wid"), row.getUUID("id"))).wasApplied();
}
// Insert new row
session.execute(insertNewBest.bind(vertex, value, verts, edges, workerCode));
//成功指示器
布尔成功=假;
//获取表中具有最佳结果的已注册行数
行=session.execute(selectCounter.bind()).one();
int rows=row.getInt(“rows”)+1;
int rmax=row.getInt(“rmax”);
//反复尝试在表中保留空白
虽然(!succ&&rows)有一个简单的问题:为什么需要它?也许另一种方法更适合您的用例。有许多并行计算机(worker)每一个都对不同的数据执行相同类型的计算,计算时间变化很大。然后有一个顶层逻辑,它获取N个最新结果并使用它执行计算。