0

我需要以一定的时间间隔将数据从我的系统转发到外部系统。为此,我已经将所有行存储在一个表中。已经转发的数据不应再次导出。

这个想法是在客户端记住上次导出时间,并在下次导出以下记录。成功导出后,旧行将被删除。

CREATE TABLE export(
    id int,
    import_date_time timestamp, 
    data text,
    PRIMARY KEY (id, import_date_time)
) WITH CLUSTERING ORDER BY (import_date_time DESC) 

insert into export(id, import_date_time, data) values (1, toUnixTimestamp(now()), 'content')

select * from export where id = 1 and import_date_time > '2017-03-30 16:22:37'

delete from export where id = 1 and import_date_time <= '2017-03-30 16:22:37'
  1. 有没有人已经实现了类似的或者你有不同的解决方案?
  2. 如果可能,我不需要请求的 id,因为我想导出所有数据
4

1 回答 1

1

如果您使用固定的分区键值(id = 1),那么所有的插入、选择和删除将一遍又一遍地发生在同一个节点上(如果 RF=1)。并且还为每次删除 cassandra 创建一个 tombstone 条目,当您执行 select 查询时 cassandra 需要合并每个条目。所以你的选择查询性能会下降。

因此,不要使用固定值,而是使用如下动态值:

CREATE TABLE export(
    hour int,
    day int,
    month int,
    year int,
    import_date_time timestamp, 
    data text,
    PRIMARY KEY ((hour, day, month, year), import_date_time)
) WITH CLUSTERING ORDER BY (import_date_time DESC); 

在这里您可以插入从中提取的小时、日、月、年的值import_date_time

选择数据时需要注意两种情况:

  1. 以前的导出时间和当前的导出时间都在同一时间。
  2. 两个时间都不在同一小时内。

对于案例一,您只需要一个查询,对于案例二,您必须执行两个查询。

示例查询:

SELECT * FROM export WHERE hour = 16 AND day = 30 AND month = 3 AND year = 2017 AND import_date_time > '2017-03-30 16:22:37';
于 2017-03-31T09:08:34.977 回答