【问题标题】:Cassandra delta/relative queryingCassandra delta/相对查询
【发布时间】:2015-04-15 15:51:29
【问题描述】:

我必须编排一个批处理,每天复制一个表的增量。该表仅被写入,从未更新。我将 java 与 jdbc 一起使用,我想知道表上是否有元数据或其他东西可以查询以获取在某个日期之后添加的所有行。


为什么是元数据? 因为我的桌子看起来像:

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(?))

简而言之,我的问题是:如何让 aTables 比某个日期更新?

【问题讨论】:

    标签: select cassandra cql database-partitioning delta


    【解决方案1】:

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

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

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

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

    然后你可以这样选择:

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

    【讨论】:

    • 好答案。时间序列建模(使用 Cassandra)中最常见的新手错误之一是尝试按单个主键对数据进行排序。您的解决方案也是我所建议的。
    • 是的,每个人都这么对我说,但事实是:要制作增量,我必须查询之前的所有位置??它并没有真正优化:/
    • 我也有同样的问题,我的分区键是 date_hour 。在运行 select * from my_table where token(date_hour) &lt; token('2014-02-03 12'); 时,它会显示错误的结果,即 date_hour 的条目也在 2015 年。是不是我们根本不应该在分区键上使用范围?
    • 我也在做同样的事情,但是随着数据大小的增加,获取增量会线性变慢。
    【解决方案2】:

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

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

    我的目标是只查询上一批中的更新行,这里是我做的方式:

    • 创建一个索引表,按日期小时分区(分钟、秒和毫秒被截断)。该表由主表中的全局索引提供。
    • 在 java 中,按小时查询索引 (loop on a calendar) 并使用 IN 查询选择主表。
    • 工作完成!

    【讨论】:

    • 所以使用IN 查询是解决方案,这是否意味着我们根本不应该在分区键中使用范围?
    • 不,例如,如果您实时使用它并且它是表的主要用途,则必须将 date_hour 添加到分区键中。但是如果你做分析的东西,比如每日增量,你可以使用索引表。不要忘记 Cassandra 不是 RDMBS,您必须考虑查询来构建表结构。最后,我想说的是,使用新的 Cassandra,您可以通过直接索引使其更性感,但我已经完成了该项目,可惜我不太记得 cassandra 的内容。
    • 哦,对不起,我想我误解了你的问题。我认为您不应该这样做,因为如果允许,您将不得不扫描整个数据库。但我不是专家。即使 jdbc 中的 fetch 非常棒,使用限制(例如按小时)而不是按范围(大于)处理结果应用程序端也更容易。
    • 我后来发现partition key 上的范围查询是允许的,但如果使用的分区器不是Order Preserving Partitioner (OPP),它们不会给出正确的结果。但是,现在不建议在 cassandra 中使用 OPP。更多内容可以在这里阅读 -> wiki.apache.org/cassandra/Partitioners。如果有人想要使用范围查询的功能(并且可能会因节点间数据分布不佳而妥协),那么您可以在配置文件cassandra.yaml 中将partitioner 参数更改为org.apache.cassandra.dht.OrderPreservingPartitioner
    猜你喜欢
    • 1970-01-01
    • 2023-01-09
    • 1970-01-01
    • 1970-01-01
    • 2014-09-15
    • 1970-01-01
    • 2018-09-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多