如何使用 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 以启用
如何使用 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 以启用