系统日期的 Cassandra DB 查询

Cassandra DB Query for System Date

我在 Cassandra 数据库中有一个 table customer_info,它包含一列 billing_due_date,这是日期字段(dd-MMM-yy 例如 17-AUG- 21).我需要根据 billing_due_datecustomer_info table 中获取某些字段,其中 billing_due_date 应该等于系统日期 +1。

有人可以为此建议 Cassandra DB 查询吗?

fetch the certain fields from customer_info table based on billing_due_date

transaction_id is primarykey , It is just generated through uuid()

不幸的是,确实没有好的方法可以做到这一点。现在,customer_info table 中的数据基于 transaction_id 的散列分布在集群中的所有节点上。本质上,任何基于 transaction_id 以外的查询都会从多个节点读取,这是 Cassandra 中的查询反模式。

在 Cassandra 中,您需要根据需要支持的查询来设计 table。例如,选择 transaction_id 作为唯一的主键可能分布良好,但在查询灵活性方面并没有提供太多。

因此,解决此查询的最佳方法是创建一个查询 table,其中包含来自 customer_info 的数据,其键定义为 PRIMARY KEY (billing_date,transaction_id)。然后,这样的查询应该有效:

> SELECT * FROM customer_info_by_date
  WHERE billing_due_date = toDate(now()) + 2d;

 billing_due_date | transaction_id                       | name
------------------+--------------------------------------+---------
       2021-08-20 | 2fe82360-e314-4d5b-aa33-5deee9f03811 | Rinzler
       2021-08-20 | 92cb9ee5-dee6-47fe-b372-0829f2e384cd |     Clu

(2 rows)

请注意,对于此示例,我使用的是系统日期加 2 天。因此,在您的情况下,您需要将“持续时间”方面从 2d 调整为 1d。 Cassandra 4.0 允许日期运算,因此如果您使用该版本,这应该可以正常工作。如果不是,则必须在应用程序端进行“系统日期加一”计算。

解决此问题的另一种方法是在 billing_due_date 上创建二级索引,但我不推荐该路径,因为它将查询多个节点以构建结果集。