如何使用cassandra查询将最近6个月的数据与timestamp
列进行比较?
与updatedTime(TimeStamp column)
和CurrentTime
相比,我需要获取属于过去3个半月的所有帐户对帐单。
例如,在 SQL 中,我们使用DateAdd()
函数来获取。我不知道如何在cassandra进行此操作。
如果有人知道,请回复。谢谢你。
答案 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();$$
此方法接收两个参数
返回日期时间戳
以下是如何使用它:
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你总是必须准备你将要使用的访问模式的结构。