嗨,我在卡桑德拉(Cassandra)中有类似的表:
CREATE TABLE TestTable( id text,
group text,
date text,
user text,
dept text,
orderby int,
files list<text>,
users list<text>,
family_memebrs list<frozen <member>>,
PRIMARY KEY ((id)));'
CREATE INDEX on TestTable (user);
CREATE INDEX on TestTable (dept);
CREATE INDEX on TestTable (group);
CREATE INDEX on TestTable (date);
Id | OrderBy
:---- | :----
101 | 1
102 | 2
105 | 3
我想以同一顺序以下IDS 105,102,103更改现有订单。即(105,1)(102,2)(103,3)。我是卡桑德拉(Cassandra)的新手,请帮助我。我认为在sql中,可以加入。
我是Cassandra的新手
我可以说。第一个线索是您结果的顺序。将id
作为您的唯一主键(使其成为分区键),您的结果将永远不会像这样返回。这个是应分类的方式:
aploetz@cqlsh:stackoverflow> SELECT id,orderby,token(id) FROM testtable ;
id | orderby | system.token(id)
-----+---------+---------------------
102 | 2 | -963541259029995480
105 | 3 | 2376737131193407616
101 | 1 | 4965004472028601333
(3 rows)
未结合的查询总是返回按照分区密钥的哈希令牌值排序的结果。我已经在您的分区密钥(id
)上运行token()
函数以显示此。
我想以同一顺序以下IDS 105,102,103更改现有订单。即(105,1)(102,2)(103,3)。
如果您需要做的就是更改orderby
列中的值,那很容易:
aploetz@cqlsh:stackoverflow> INSERT INTO testtable(id,orderby) VALUES ('101',3);
aploetz@cqlsh:stackoverflow> INSERT INTO testtable(id,orderby) VALUES ('102',2);
aploetz@cqlsh:stackoverflow> INSERT INTO testtable(id,orderby) VALUES ('105',1);
aploetz@cqlsh:stackoverflow> SELECT id,orderby,token(id) FROM testtable ;
id | orderby | system.token(id)
-----+---------+---------------------
102 | 2 | -963541259029995480
105 | 1 | 2376737131193407616
101 | 3 | 4965004472028601333
(3 rows)
作为Cassandra Primary键是唯一的,只需插入该密钥更改的新的非键列值orderby
。
现在,如果您想通过orderby
列实际上对结果进行分类,那是另一个问题,无法用当前模型解决。
如果这是您真正想做的,那么您将需要一个具有不同主键定义的新表。因此,我将创建具有两个更改的同一表:我将其命名为testtable_by_group
,然后使用PRIMARY KEY (group,orderby,id))
的复合主键。现在,我可以查询一个特定的组" group1",然后查看结果排序。
aploetz@cqlsh:stackoverflow> CREATE TABLE testtable_by_group (group text,id text,orderby int,PRIMARY KEY (group,orderby,id));
aploetz@cqlsh:stackoverflow> INSERT INTO testtable_by_group(group,id,orderby) VALUES ('group1','101',3);
aploetz@cqlsh:stackoverflow> INSERT INTO testtable_by_group(group,id,orderby) VALUES ('group1','102',2);
aploetz@cqlsh:stackoverflow> INSERT INTO testtable_by_group(group,id,orderby) VALUES ('group1','105',1);
aploetz@cqlsh:stackoverflow> SELECT group,id,orderby,token(group) FROM testtable_by_group WHERE group='group1';
group | id | orderby | system.token(group)
--------+-----+---------+----------------------
group1 | 105 | 1 | -2413872665919611707
group1 | 102 | 2 | -2413872665919611707
group1 | 101 | 3 | -2413872665919611707
(3 rows)
这样,group
是新的分区密钥。orderby
是第一个聚类键,因此group
中的行会自动对其进行排序。id
即将确保唯一性,如果任何两个行具有相同的orderby
。
请注意,我将token()
功能留在结果集中,但是我将其运行在新的分区密钥(group
)上。如您所见,group1
的键在所有3行中都悬浮到同一令牌,这意味着在多节点环境中,所有3行都将一起存储在一起。这可以在您的群集中创建一个"热点",其中有些节点比其他节点具有更多的数据。这就是为什么一个好的主密钥定义确保查询满意度和数据分布。
我不久前就为此主题写了一篇文章。给它阅读,它应该为您提供帮助:http://www.datastax.com/dev/blog/we-shall-have-order-------->