卡桑德拉 delta/relative 查询

Cassandra delta/relative querying

我必须安排一个批处理,每天复制一个 table 的增量。这个table只是写的,从来没有更新过。我将 java 与 jdbc 一起使用,我想知道 table 上是否有元数据或其他内容,可以查询这些元数据或其他内容以获取在特定日期后添加的所有行。


为什么要元数据? 因为我的 table 看起来像 :

CREATE TABLE aTable (
  aTable_id timeuuid,
  ...
  PRIMARY KEY ((aTable_id))
) WITH
...

我不能将 timeuuid 键放在 where 子句中,例如:

SELECT * FROM aTable WHERE aTable_id > minTimeuuid(?)

和令牌函数,即使 aTable_id 被正确排序也会给我错误的结果:

SELECT * FROM aTable WHERE token(aTable_id) > token(minTimeuuid(?))

简而言之,我的问题是:如何获得比特定日期更新的表?

在cassandra中主键也是分区键。 为每个 timeuuid 创建一个分区是没有意义的...... 所以通常你用主键对事物进行分组,然后使用聚类键来排序。

这是一个接近我所做的例子:

create table sensors(
    location varchar, 
    timestamp timeuuid, 
    ...
    PRIMARY KEY(location, timestamp)
) WITH CLUSTERING ORDER BY (timestamp DESC) AND ...

位置是分区键,时间戳是集群键。

然后你可以select像这样:

SELECT * from sensors 
    where location='tarifa' 
    and timestamp > maxTimeuuid('2015-04-15 13:00') 
    and timestamp < minTimeuuid('2015-04-15 15:00');

所以我最终找到了一个解决方案,是在介绍 cassandra 3.0 的聚会上找到的。

请记住,架构是为另一个请求设置的,而键不是为增量请求设置的。

我的目的是只查询上一批次的更新行,我这样做是这样的:

  • 创建索引table,按日期小时分区(分、秒和毫秒被截断)。此 table 由来自主要 table.
  • 的全球索引提供
  • 在 java 中,按小时查询索引 (loop on a calendar),select 使用 IN 查询主要 table。
  • 任务完成!