Cassandra只导出/转发一次数据

时间:2017-03-31 07:29:18

标签: apache cassandra forward data-export

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

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

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

1 个答案:

答案 0 :(得分:1)

如果使用固定分区键值(id = 1),则所有插入,选择和删除都将在同一节点(如果RF = 1)上反复进行。并且还为每个删除cassandra创建一个逻辑删除条目,当您执行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. 这两个时间都不在同一时间内。
  3. 对于案例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';