Cassandra:当桌子使用WITH COMPACT STORAGE时,如何通过Cassandra中的第三个主键选择一行?

时间:2018-01-10 06:41:08

标签: cassandra storage

CREATE TABLE gsg.callback_queue (
    key blob,
    column1 bigint,
    column2 text,
    value blob,
    PRIMARY KEY (key, column1, column2)
) WITH COMPACT STORAGE
    AND CLUSTERING ORDER BY (column1 ASC, column2 ASC)
    AND caching = '{"keys":"ALL", "rows_per_partition":"NONE"}'
    AND comment = ''
    AND compaction = {'class': 'org.apache.cassandra.db.compaction.LeveledCompactionStrategy'}
    AND compression = {'sstable_compression': 'org.apache.cassandra.io.compress.LZ4Compressor'}
    AND dclocal_read_repair_chance = 0.1
    AND default_time_to_live = 0
    AND gc_grace_seconds = 43200
    AND max_index_interval = 2048
    AND memtable_flush_period_in_ms = 0
    AND min_index_interval = 128
    AND read_repair_chance = 0.0
    AND speculative_retry = 'NONE';

我执行以下查询:

select * from callback_queue 
where column2='167-df8fb9d8-13b0-418e-b21b-f5599c7819fc' allow filtering;

但它抛出了这样的异常:

  

message =“PRIMARY KEY列”column2“不能被限制(在前   列“column1”不受限制)

然后我使用第二个索引:

create index idx callback_queue(column2);

但它抛出了这样的异常:

  

COMPACT中的PRIMARY KEY列不支持辅助索引   存储表

那么,我怎么不能用column2获取原始数据?

3 个答案:

答案 0 :(得分:0)

在您的表中,列key是分区键,因此在执行where子句查询时应该存在。 您可以更改架构,也可以从支持给定查询的父表创建materialised view

CREATE MATERIALIZED VIEW gsg.callback_queue_by_column2 AS
    SELECT key, column1, column2, value
    FROM gsg.callback_queue
    WHERE key IS NOT NULL AND column1 IS NOT NULL AND column2 IS NOT NULL AND value IS NOT NULL
    PRIMARY KEY (column2, key, column1);

现在,以下查询将有效。

select * from callback_queue_by_column2 where column2='167-df8fb9d8-13b0-418e-b21b-f5599c7819fc';

答案 1 :(得分:0)

在主键中,第一部分是分区键,第二部分是聚类列。

主键(分区键,聚类列);

定义主键时,您可以使用复合键或复合键。

复合键
多列主键称为复合键:主键(分区键,聚类列);

复合键
基于多列的分区键:主键((分区键1,分区键2));

如果使用复合键,则查询中的where子句应包含用于定义分区键的所有列。

在您的情况下,主键列“key”应该是where子句的一部分。

答案 2 :(得分:0)

我建议你不要使用ALLOW FILTERING子句,尤其是在包含大量事务的生产数据库中(我不知道这是不是你的情况)。在您的情况下,群集中的所有节点都将执行大量操作来回答查询。

并且,正如错误所示,您无法为主键列创建索引。如果确实需要在column2上创建索引,则不应将column2用作主键的一部分。

如果您希望Cassandra表现良好,拥有一个好的数据模型非常重要。因此,我建议您至少学习Cassandra数据建模的基础知识。

在Cassandra中,通过提前考虑您的查询来建模数据是一种很好的做法,即在开始数据建模之前先了解您的查询是一件好事。如有必要,还要对数据模型进行非规范化。在Cassandra中,可以在多个表中复制数据。

因此,在您的情况下,我猜您应该创建另一个表,并且此表应该具有column2的分区键。你也应该在这个新表中复制你的数据。