我在单节点集群中安装了Apache Cassandra。当我构建列族时,由于基于主键的murmur3分区器,数据被分区,并且表不保留主键的顺序。因此,我看到的SStable输出将按位置排序,但主键的顺序会有所改变。
根据我的要求,我不希望改变主键的顺序。那么,我该如何改变Cassandra的分区方案呢?我查看了cassandra.yaml文件,但没有关于如何更改默认的murmur3分区程序的说明。如果更改默认值会有什么影响吗?
这是我创建的表:
CREATE TABLE ycsb.expt (
y_id varchar,
field0 varchar,
field1 varchar,
field2 vachar,
PRIMARY KEY (y_id, field0) WITH CLUSTERING ORDER BY (field0 ASC);
将数据添加到表后,当我执行“select * from expt”时,这是我的输出
y_id | field0 | field1 | field2
--------+------------+--------------+------------
user48 | ?O3 :<5[ | *B-0Qa | .
user14 | .J | (=~/0`"4 | 03
user40 | (Uu' | +.0 | ;
user42 | // | ((* | 3O
user8 | , | =Ao3[??< | 4.2(Hm6O
我希望此输出的顺序与插入数据的顺序相同,我按排序顺序插入(例如:User8,User 14,User40)。尽管创建了聚类键,但它已经改变了数据。
如何确保输出按上表排序?
cassandra.yaml中的“partitioner”配置决定了集群使用的分区程序。你有三种可能性,但我怀疑你确实想要Murmur3 Partitioner。
文档可以进一步解释其他选择如何工作:https://docs.datastax.com/en/cassandra/3.0/cassandra/architecture/archPartitionerAbout.html
但是听起来你的问题不在于使用分区器而是使用数据模型。如果您的要求决定了您的行的顺序,则应重新评估它以使其具有群集密钥。请注意,这将与分区键分开,分区键确定行将落入哪些分区。
请参阅此处发布的答案,以获取有关配置主键的各种方法的说明:Difference between partition key, composite key and clustering key in Cassandra?
一旦拥有了一个您满意的集群密钥,您就可以在CQL查询中的那些列上使用ORDER BY指令。