如何使用cassandra查询获取最近6个月的数据与timestamp列相比较?

时间:2017-04-04 05:14:51

标签: cassandra cassandra-2.0 cassandra-2.1 cassandra-cli

如何使用cassandra查询将最近6个月的数据与timestamp列进行比较? 与updatedTime(TimeStamp column)CurrentTime相比,我需要获取属于过去3个半月的所有帐户对帐单。 例如,在 SQL 中,我们使用DateAdd()函数来获取。我不知道如何在cassandra进行此操作。 如果有人知道,请回复。谢谢你。

2 个答案:

答案 0 :(得分:1)

Cassandra 2.2及更高版本允许用户定义函数(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();$$

此方法接收两个参数

  • 日期时间戳:您希望加/减月数的日期
  • month int:您想要或添加的月数(+)从日期减去( - )

返回日期时间戳

以下是如何使用它:

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

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

注意:默认情况下,在cassandra.yaml中禁用用户定义的函数 - 如果您了解安全风险,请设置enable_user_defined_functions = true以启用

答案 1 :(得分:0)

在cassandra中,您必须提前构建查询。

另请注意,您可能需要根据您在一段时间内拥有的帐户数量来提取数据。

如果您的整个数据库不包含超过100k条目,那么只需定义一个通用分区即可,我们可以使用名称“all”。但通常人们有很多数据只是进入桶中,其中包含月,周,小时的名称。这取决于您获得的插入数量。

创建存储桶的原因是每个节点都可以通过它的分区键找到分区。这是primary key定义的第一部分。然后在每个节点上,数据按您传递到primary key的第二个信息进行排序。对数据进行排序后,您可以对其进行“扫描”,即您可以通过给出时间戳参数来检索它们。

假设您要检索过去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'

等等。

如果你有一些非常简单的东西,让我们说预期的10万个条目,那么你可以使用上面的模式,只做类似的事情:

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你总是必须准备你将要使用的访问模式的结构。