【问题标题】:Retrieve rows from last 24 hours检索过去 24 小时的行
【发布时间】:2020-01-08 21:42:10
【问题描述】:

我有一个包含以下内容的表格(删除了其他字段)

CREATE TABLE if NOT EXISTS request_audit (
   user_id text,
   request_body text,
   lookup_timestamp TIMESTAMP
   PRIMARY KEY ((user_id), lookup_timestamp)
) WITH CLUSTERING ORDER BY ( lookup_timestamp DESC);

我使用以下内容创建记录

INSERT INTO request_audit (user_id, lookup_timestamp, request_body) VALUES (?, ?, toTimestamp(now()))

我正在尝试检索过去 24 小时内的所有行,但我遇到了时间戳问题, 我试过了

SELECT * from request_audit WHERE user_id = '1234' AND lookup_timestamp > toTimestamp(now() - "1 day" ) 以及尝试从查询中抽出一天时间的各种其他方式。

【问题讨论】:

  • 为什么不在主键中添加日期(不带时间)?我认为在这种情况下使用不同的分区可能会很好,只是为了避免热点,以防一个用户获得很多行(即使您已经有一个反向时间序列)。然后,您使用两个查询(并行)管理过去 24 小时。

标签: cassandra cql


【解决方案1】:

Cassandra 的日期操作支持非常有限。您需要的是一个自定义函数来进行日期数学计算。

灵感来自这里。 How to get Last 6 Month data comparing with timestamp column using cassandra query?

你可以写一个UDF(用户定义函数)到日期操作。

CREATE FUNCTION dateAdd(date timestamp, day int)     
CALLED ON NULL INPUT     
RETURNS timestamp     
LANGUAGE java     
AS 
$$java.util.Calendar c = java.util.Calendar.getInstance();
c.setTime(date);
c.add(java.util.Calendar.DAY_OF_MONTH, day);
return c.getTime();$$ ;

请记住,您必须在配置中启用 UDF。卡桑德拉.yml。希望这是可能的。

enable_user_defined_functions: true

一旦完成,这个查询就可以完美运行。

SELECT * from request_audit WHERE user_id = '1234' AND lookup_timestamp > dateAdd(dateof(now()), -1)

【讨论】:

  • 24 小时前计算的现代代码:java.time.Instant.now().minus( 24 , ChronoUnit.HOURS )。如果您必须有一个遗留类 java.util.Date 对象作为结果,则将该代码包装在对 Date.from( … ) 的调用中。
【解决方案2】:

您不能直接从 CQL 执行此操作,因为它不支持这种表达式。如果您是从 cqlsh 运行此查询,那么您可以尝试将所需日期替换为以下内容:

date --date='-1 day' '+%F %T%z'

并执行此查询。

如果您从程序中调用它,只需使用相应的日期/时间库来获取对应的日期 -1 天,但这取决于您使用的语言。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-08
    • 2014-09-17
    • 1970-01-01
    • 1970-01-01
    • 2017-02-27
    相关资源
    最近更新 更多