Cassandra 仅导出/转发一次数据



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

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

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,因为我想 导出所有数据

如果使用固定分区键值 (id = 1(,则所有插入、选择和删除将在同一节点上一遍又一遍地发生(如果 RF=1(。并且对于每次删除 cassandra 创建一个逻辑删除条目,当你执行选择查询时,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';

最新更新