当前位置: 首页 > 知识库问答 >
问题:

如何使用cassandra查询与时间戳列比较获取过去6个月的数据?

谈琦
2023-03-14

如何使用cassandra查询获取与时间戳列比较的过去6个月数据?我需要获取与updatedTime(TimeStamp列)MONtTime比较属于过去3/6个月的所有帐户声明。例如在SQL中,我们使用DateAdd()函数tor this来获取。我不知道如何在cassandra中进行此操作。如果有人知道,请回复。提前感谢。

共有2个答案

锺离高丽
2023-03-14

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

还要注意的是,您可能需要根据您在一段时间内拥有的帐户数量来存储数据。

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

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

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

架构可能是以下内容:

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

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

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,您必须始终为要使用的访问模式准备结构。

滕璞瑜
2023-03-14

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();$$

此方法接收两个参数

  • 日期时间戳:您想要添加或减去月份数的日期
  • 月int:您想要或加()从日期中减去(-)的月数

返回日期时间戳

以下是如何使用此功能:

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

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

注意:默认情况下,在cassandra中禁用用户定义函数。yaml-如果您意识到安全风险,请将enable\u user\u defined\u functions=true设置为启用

 类似资料:
  • 我想查询cassandra timestamp列,例如this hour、last hour、beather。 我在mysql中执行了与昨天数据相同的查询

  • 使用Cassandra 2.28,Drive 3,Sparks2。我在Cassandra中有一个timestamp列,我只需要按日期部分查询它。如果我按日期查询:<代码>。其中(“交易日期=?”,“2012-01-21”:它不会带来任何结果。如果我包括时间部分,它会显示无效日期。我的数据(如我在cqlsh中所读)是:2012-01-21 08:01:00 0000 参数:“2012-01-21”

  • 我有一个从数据库中检索的时间戳值,然后将其与当前时间戳进行比较。我实际上想检索过去两个小时内登录的用户的数据。不幸的是,我面临着这个错误。请帮帮我,伙计们。我会感谢你的。我被困在这个密码里了。我的问题如下。 这就是我的错误。 org.hibernate.hql.ast.查询语法异常:意外令牌: 04行附近1,列128[SELECT ls fromcom.ideacrossing.skild.hbm

  • 我有两个时间戳,一个是我创建的时间戳,另一个是我创建的时间戳(Laravel)。。。在数据库中,两者都有类型时间戳和默认值0000-00-00:00:00。。。但是 给出字符串。而是object/Carbon。这些时间戳有什么问题? 在使用格式('U')转换为整数后,我必须对两者进行比较。我只能在碳对象上调用此方法。我该怎么做?

  • 从mytable中选择*,其中id='5'和postingdate>='2018-11-06 00:00:00'和postingdate<='2018-11-06 23:59:59'; 在开发中心控制台(或CQLSH)上运行这个查询,会给我相同的结果,而不考虑时区。我在PST和IST中都尝试过,得到了同样的结果。在执行查询之前,Cassandra是在执行PST->UTC还是IST->UTC转换?如

  • 我有一个类似于。 我有一个数字,12作为参数值。我想做的是,我想将数字12与上述创建的时间和目标进行比较。我该怎么做呢。 我发现,在检索数据的过程中,Laravel会自动将这些创建的对象转换为碳对象。是否有一种方法可以在检索期间提取创建的_的月份部分? 显然,上面的代码不起作用。我发现正在做