如何在SQL中设置cassandra中的自动增量ID(整数)?

时间:2016-03-09 05:59:04

标签: cassandra

我有数百万条记录,现在我必须获取最新的最新记录。我想用record_id保存每条记录,我希望在插入新记录时,此record_id会自动增加。

例如:假设我有1000条记录,首先我想要最新的100条记录,从901到1000.现在在第二次请求时,我想要下一条100条最新记录从801到900.我已经经历了这么多链接但是没有找到任何相关的东西。任何人都能给出适当的解决方案吗?

我们假设表格emp包含:
姓名文本,
record_id int,
地址文本

假设name是主键,record_id是簇密钥。但请不要现在讨论主键概念,因为我的要求是创建id作为集群密钥(我正在使用cassandra 2.2.3和cql 3.3.1)。

2 个答案:

答案 0 :(得分:2)

自动增加ID在Cassandra或任何其他分布式数据库中都不起作用。

为什么呢?让我们说你有三个节点。两个节点同时向同一个表发送写请求。一个检查表的最大ID,并获得2544的(示例)响应。在写入新行之前,另一个节点执行相同的过程,并且还获得2544.现在您有两行插入2545,在卡桑德拉,最后一次写作"胜利"所以你将失去第一次写作。

因此,这也是为什么在Cassandra中将read-before-write方法视为反模式的原因。正如Stefan建议的那样,TimeUUID解决了这个问题。

在Cassandra中,您需要设计表格以适合您的查询模式。我听到的是,您想要检索最近100名更新的员工。我会创建一个特定的表来服务:

CREATE TABLE employee_updates (
  datebucket text,
  record_id timeuuid,
  name text,
  address text,
  PRIMARY KEY (datebucket,record_id))
WITH CLUSTERING ORDER BY (record_id DESC);

现在,当您在此表中查询最近100条记录时:

SELECT * FROM employee_udpates WHERE datebucket='20160309' LIMIT 100;

您可以获取该特定日期的最新100条记录。

注意:如果" day"对于您的解决方案而言过于精细(每天只有少数员工记录得到更新),然后可以将其扩展到更适用的范围。

<强>更新

  

如果我想要之前的最新100条记录是801到900

,该怎么办?

这个解决方案实际上确实有一种方法可以实现&#34; page&#34;通过结果。

让我们在您的表格中插入一些行:

> INSERT INTO employee_updates (datebucket, record_id , address , name ) VALUES ('20160309',now(),'123 main st.','Bob Kerman');
> INSERT INTO employee_updates (datebucket, record_id , address , name ) VALUES ('20160309',now(),'456 Gene ave.','Bill Kerman');
> INSERT INTO employee_updates (datebucket, record_id , address , name ) VALUES ('20160309',now(),'34534 Water st.','Jebediah Kerman');
> INSERT INTO employee_updates (datebucket, record_id , address , name ) VALUES ('20160309',now(),'843 Rocket dr.','Valentina Kerman');
> INSERT INTO employee_updates (datebucket, record_id , address , name ) VALUES ('20160309',now(),'33476 Booster way','Isabella Kerman');
> INSERT INTO employee_updates (datebucket, record_id , address , name ) VALUES ('20160309',now(),'43 Solid Rocket pl.','Helcine Kerman');

现在让我选择今天最近的前3名:

> SELECT datebucket, record_id, dateof(record_id), name 
  FROm employee_updates WHERE datebucket='20160309' LIMIT 3;

 datebucket | record_id                            | system.dateof(record_id) | name
------------+--------------------------------------+--------------------------+------------------
   20160309 | 511f9150-e5db-11e5-a4ba-a52893cc9f36 | 2016-03-09 09:43:02+0000 |   Helcine Kerman
   20160309 | 2f9f3670-e5db-11e5-a4ba-a52893cc9f36 | 2016-03-09 09:42:06+0000 |  Isabella Kerman
   20160309 | 23b0dc60-e5db-11e5-a4ba-a52893cc9f36 | 2016-03-09 09:41:46+0000 | Valentina Kerman

(3 rows)

由于我已经按照DESCending顺序将此表聚集在record_id上,因此我可以通过查询比我读到的最后一个record_id更少的23b0dc60-e5db-11e5-a4ba-a52893cc9f36来获得接下来的3条记录。在这种情况下,该{是> SELECT datebucket, record_id, dateof(record_id), name FROm employee_updates WHERE datebucket='20160309' AND record_id < 23b0dc60-e5db-11e5-a4ba-a52893cc9f36 LIMIT 3; datebucket | record_id | system.dateof(record_id) | name ------------+--------------------------------------+--------------------------+----------------- 20160309 | 16400100-e5db-11e5-a4ba-a52893cc9f36 | 2016-03-09 09:41:23+0000 | Jebediah Kerman 20160309 | 0b239cf0-e5db-11e5-a4ba-a52893cc9f36 | 2016-03-09 09:41:05+0000 | Bill Kerman 20160309 | 00d648b0-e5db-11e5-a4ba-a52893cc9f36 | 2016-03-09 09:40:47+0000 | Bob Kerman (3 rows)

{{1}}

答案 1 :(得分:1)

Cassandra不支持自动增量ID。但您可以使用time-based UUID代替群集密钥,以确保记录将从最旧到最近排序。