时间:2016-02-01 16:25:35

标签: cassandra

我们最近决定将应用程序迁移到Cassandra(来自Oracle),因为它可能有助于提高性能,而且由于我有一个不错的Oracle背景,我必须承认我很难与Cassandra“思维方式”斗争。

基本上我有一张约15个字段的表,其中包括这些日期。其中一个日期用于“订购”,因此我需要能够对其进行“订购”。但与此同时,这个字段可以为空。

现在我认为将该字段作为主键让我实际按顺序执行,但我不能再将空值赋给它了...

有什么想法吗?

1 个答案:

答案 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)

注意:

  • 如果可能,这可能是您想要避免的事情。
  • 使用" NULL" INSERT / UPDATE(Upsert) value与DELETE操作相同,并创建逻辑删除。
  • 将零(0)作为TIMESTAMP保持默认为1970-01-01 00:00:00 UTC。我当前的时区偏移量是-0600,这就是出现1969-12-31 18:00:00的值的原因。
  • 我不需要在查询中指定ORDER BY子句,因为定义的聚类顺序是我想要的。根据您的查询要求配置它是一个好主意,因为所有ORDER BY实际上都可以强制执行A​​SCending或DESCending。您无法在ORDER BY中指定与您定义的群集订单不同的列。
  • 使用零TIMESTAMP的一个优点是,包含该键的所有行都在结果集的底部(DESCending order)排序,因此您始终知道在哪里查找它们。
  • 不确定您的分区键是什么,但我使用了monthBucket。仅供参考 - " bucketing"是一种Cassandra建模技术,用于处理时间序列数据,以便在群集中均匀分布数据。