我们最近决定将应用程序迁移到Cassandra(来自Oracle),因为它可能有助于提高性能,而且由于我有一个不错的Oracle背景,我必须承认我很难与Cassandra“思维方式”斗争。
基本上我有一张约15个字段的表,其中包括这些日期。其中一个日期用于“订购”,因此我需要能够对其进行“订购”。但与此同时,这个字段可以为空。
现在我认为将该字段作为主键让我实际按顺序执行,但我不能再将空值赋给它了...
有什么想法吗?
答案 0 :(得分:3)
你是正确的,你不能通过Cassandra中的NULL值进行查询。这是一个非常好的理由;这就是NULL值确实不存在。该行根本不包含" NULL"的值。柱。所以CQL接口使用" NULL"来抽象它。输出,因为这更容易向人们解释。
Cassandra在其关键字段中也不允许NULL(或缺少列值)。因此,在这种情况下,您可以做的最好的事情是提出一个时间戳常量,您(和您的应用程序)认为它是NULL而不会破坏任何东西。所以请考虑这个示例表结构:
aploetz@cqlsh:stackoverflow> CREATE TABLE eventsByMonth (
monthBucket text,
eventTime timestamp,
event text,
PRIMARY KEY (monthBucket,eventTime))
WITH CLUSTERING ORDER BY (eventTime DESC);
接下来我将插入一些值来测试:
aploetz@cqlsh:stackoverflow> INSERT INTO eventsByMonth (monthBucket,eventTime,event)
VALUES ('201509','2015-09-19 00:00:00','Talk Like A Pirate Day');
aploetz@cqlsh:stackoverflow> INSERT INTO eventsByMonth (monthBucket,eventTime,event)
VALUES ('201509','2015-09-25 00:00:00','Hobbit Day');
aploetz@cqlsh:stackoverflow> INSERT INTO eventsByMonth (monthBucket,eventTime,event)
VALUES ('201509','2015-09-19 21:00:00','dentist appt');
aploetz@cqlsh:stackoverflow> INSERT INTO eventsByMonth (monthBucket,eventTime,event)
VALUES ('201503','2015-03-14 00:00:00','Pi Day');
让我们说我有两个要跟踪的事件,但我不知道eventTime
s,所以我没有插入NULL,而是只需指定一个零。为了这个例子,我将在2015年9月和2015年10月推出一个:
aploetz@cqlsh:stackoverflow> INSERT INTO eventsByMonth (monthBucket,eventTime,event)
VALUES ('201510',0,'Some random day I want to keep track of');
aploetz@cqlsh:stackoverflow> INSERT INTO eventsByMonth (monthBucket,eventTime,event)
VALUES ('201509',0,'Some other random day I want to keep track of');
现在,当我查询2015年9月时,我将获得以下输出:
aploetz@cqlsh:stackoverflow> SELECT * FROM eventsbymonth WHERe monthbucket = '201509';
monthbucket | eventtime | event
-------------+--------------------------+-----------------------------------------------
201509 | 2015-09-25 00:00:00-0500 | Hobbit Day
201509 | 2015-09-19 21:00:00-0500 | dentist appt
201509 | 2015-09-19 00:00:00-0500 | Talk Like A Pirate Day
201509 | 1969-12-31 18:00:00-0600 | Some other random day I want to keep track of
(4 rows)
注意:
ORDER BY
子句,因为定义的聚类顺序是我想要的。根据您的查询要求配置它是一个好主意,因为所有ORDER BY
实际上都可以强制执行ASCending或DESCending。您无法在ORDER BY
中指定与您定义的群集订单不同的列。monthBucket
。仅供参考 - " bucketing"是一种Cassandra建模技术,用于处理时间序列数据,以便在群集中均匀分布数据。