【问题标题】:query to get records by multiple ranges in cassandra查询以在 cassandra 中按多个范围获取记录
【发布时间】:2014-09-14 02:40:36
【问题描述】:

我有以下型号:

CREATE TABLE IF NOT EXISTS log (
  date varchar,
  timeid timeuuid,
  message varchar,
  ip varchar,
  time timestamp,
  user bigint,
  file varchar,
  line int,
  func varchar,
  level int,
  PRIMARY KEY (date, timeid, time)
) WITH CLUSTERING order by (timeid DESC);

如何获取某一天的所有日志,其中记录在给定的 timeid 和时间值之间?

目前的问题是,如果我使用 timeid>something,我不能使用 time>something,因为 cassandra 不允许对集群键进行多重过滤(非 EQ)。

我尝试了类似的东西

SELECT * FROM log 
    WHERE date='2014-09-14' 
    AND (timeid, time) <= (1245a230-3baa-11e4-8ca7-4bdg1fe06d46, '2014-09-14 03:57:16+0200') 
    AND (timeid, time) >= (cb66eef0-3ba9-11e4-8ca7-4bd6sfe06d46, '2015-09-14 02:57:14+0200');

但在这种情况下,cassandra 没有限制时间,所以我仍然会在 2015-09-14 02:57:14+0200 之前获得值,所以它只是在寻找 timeid 值。

有人知道怎么解决吗?

【问题讨论】:

    标签: cassandra cql cql3 cassandra-2.0


    【解决方案1】:

    TimeUUID 中包含时间戳编码,因此除非您在 timeuuid 中使用的时间戳与时间值不同,否则您应该可以根据 timeid 进行过滤。

    不仅如此,cql 还有一些内置函数可以让这更容易,例如

    SELECT * FROM myTable
       WHERE t > maxTimeuuid('2013-01-01 00:05+0000')
       AND t < minTimeuuid('2013-02-02 10:00+0000')
    

    参考Datastax Documentation on TimeUUID functions

    【讨论】:

    • 问题我因为我可以在 '2013-01-01 00:05+0000' 上有很多记录,我需要知道哪些是新的,哪些是旧的。有了这个 '2013-01- 01 00:05+0000' 我只能在几秒钟内获得精度,这在我的情况下不太好。还有其他想法吗?
    • Timeuuids 支持精度非常高的时间戳,timeuuid 使用自 UTC 00:00:00.00 起以 100 纳秒为间隔的时间(60 位),用于防止重复的时钟序列号(14 位),加上 IEEE 801 MAC 地址(48 位)以生成唯一标识符。例如:d2177dd0-eaa2-11de-a572-001b779c76e3
    猜你喜欢
    • 2017-02-28
    • 2012-04-22
    • 2012-01-09
    • 2021-12-24
    • 2013-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-10
    相关资源
    最近更新 更多