Cassandra:更新具有不同值的多行



嗨,我在卡桑德拉(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-------->

最新更新