如何使用 cassandra 查询获取最近 6 个月的数据与时间戳列进行比较?

How to get Last 6 Month data comparing with timestamp column using cassandra query?

如何使用 cassandra 查询获取与 timestamp 列比较的最近 6 个月的数据? 我需要获取与 updatedTime(TimeStamp column)CurrentTime 相比属于过去 3/6 个月的所有账户报表。 例如在 SQL 中我们使用 DateAdd() 函数来获取。我不知道如何在 cassandra 中进行此操作。 如果有人知道,reply.Thanks提前。

在 cassandra 中,您必须预先构建查询。

另请注意,您可能必须根据一段时间内拥有的帐户数量对数据进行存储。

如果您的整个数据库包含的条目不超过 100k,那么您只需定义一个通用分区就可以了,比如说名称 'all'。但通常人们有很多数据只是简单地放入带有月、周、小时名称的桶中。这取决于您获得的插入数量。

创建桶的原因是每个节点都可以通过它的分区键找到一个分区。这是 primary key 定义的第一部分。然后在每个节点上,数据根据您传递给 primary key 的第二个信息进行排序。对数据进行排序后,您可以 "scan" 处理它们,即您可以通过提供时间戳参数来检索它们。

假设您要检索过去 6 个月的帐户,并且您要将一个月的所有帐户保存在同一个存储桶中。

架构可能类似于:

create table accounts {
    month text,
    created_time timestamp,
    account text,
    PRIMARY KEY (month, created_time)
}

通常您会在应用程序级别执行此操作,合并查询是一种反模式但 o.k。对于少量查询:

select account  
from accounts 
where month = '201701';

输出:

'201702'
'201703'

等等。

如果你有一些非常简单的东西,比如预期的 100 000 个条目,那么你可以使用上面的模式并执行类似的操作:

create table accounts {
    bucket text,
    created_time timestamp,
    account text,
    PRIMARY KEY (bucket, created_time)
}

select account 
from accounts 
where bucket = 'some_predefined_name' 
  and created_time > '2016-10-04 00:00:00'

再一次作为总结,对于 cassandra,您总是必须为您将要使用的访问模式准备结构。

Cassandra 2.2 及更高版本允许用户定义可应用于 table 中存储的数据的函数 (UDT) 作为查询结果的一部分。

如果您使用 Cassandra 2.2 及更高版本,您可以创建自己的方法UDF

CREATE FUNCTION monthadd(date timestamp, month 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.MONTH, month);return c.getTime();$$

这个方法接收两个参数

  • date timestamp: 您要加减月数的日期
  • month int:您想要的月数或从日期
  • 中添加 (+) 减去 (-)

Return 日期时间戳

以下是使用方法:

SELECT * FROM ttest WHERE id = 1 AND updated_time >= monthAdd(dateof(now()), -6) ;

这里的 monthAdd 方法从当前时间戳中减去 1 个月,所以这个查询将是上个月的数据

注意:默认情况下,用户定义的函数在 cassandra.yaml 中被禁用 - 如果您意识到安全风险

,请设置 enable_user_defined_functions=true 以启用