`
yunnick
  • 浏览: 392293 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Cassandra1.1.1建立复合主键后,如何再建立二级索引?

阅读更多

最近在使用Cassandra,版本为1.1.1, CQL版本为3.0.0。遇到如下问题。

目标:利用复合主键进行查询和排序,并想利用二级索引进行多条件查询。

首先CQL建表,用到复合主键(instigator, startedAt):

 

    CREATE TABLE altercations ( instigator text, startedAt text, shipsDestroyed text, energyUsed text,allianceInvolvement text, PRIMARY KEY (instigator, startedAt) );

然后建立二级索引:

CREATE INDEX ON altercations (shipsDestroyed);

执行CREATE INDEX 操作后,Cassandra报错:

    java.lang.IllegalArgumentException
    at java.nio.Buffer.limit(Buffer.java:249)
    at org.apache.cassandra.db.marshal.AbstractCompositeType.getBytes(AbstractCompositeType.java:51)
    at org.apache.cassandra.db.marshal.AbstractCompositeType.getWithShortLength(AbstractCompositeType.java:60)
    at org.apache.cassandra.db.marshal.AbstractCompositeType.getString(AbstractCompositeType.java:140)
    at org.apache.cassandra.config.CFMetaData.getDefaultIndexName(CFMetaData.java:875)
    at org.apache.cassandra.config.CFMetaData.addDefaultIndexNames(CFMetaData.java:863)
    at org.apache.cassandra.cql3.statements.CreateIndexStatement.announceMigration(CreateIndexStatement.java:90)
    at org.apache.cassandra.cql3.statements.SchemaAlteringStatement.execute(SchemaAlteringStatement.java:99)
    at org.apache.cassandra.cql3.QueryProcessor.processStatement(QueryProcessor.java:108)
    at org.apache.cassandra.cql3.QueryProcessor.process(QueryProcessor.java:121)
    at org.apache.cassandra.thrift.CassandraServer.execute_cql_query(CassandraServer.java:1237)
    at org.apache.cassandra.thrift.Cassandra$Processor$execute_cql_query.getResult(Cassandra.java:3542)
    at org.apache.cassandra.thrift.Cassandra$Processor$execute_cql_query.getResult(Cassandra.java:3530)
    at org.apache.thrift.ProcessFunction.process(ProcessFunction.java:32)
    at org.apache.thrift.TBaseProcessor.process(TBaseProcessor.java:34)
    at org.apache.cassandra.thrift.CustomTThreadPoolServer$WorkerProcess.run(CustomTThreadPoolServer.java:186)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at java.lang.Thread.run(Thread.java:619)

 但是,把复合主键改为单一主键的话,这个错误是没有的。

 

 

经过一天的思考,发现确实不能建立二级索引了。
本人对二级索引建立的内部原理不是很清楚,但参考Apache Cassandra 1.1 Documentation,发现确实只能用主键查询(就是多建几个主键),而且多条件查询时(除最后一个外)必须用“=”表达式。
比如像这样:
建表:

CREATE TABLE altercations ( instigator text, startedAt text, shipsDestroyed text, energyUsed text, allianceInvolvement text, PRIMARY KEY (instigator, startedAt, shipsDestroyed) );

 
查询:

SELECT * FROM altercations WHERE instigator='Jayne Cobb' AND startedAt = '7943-06-23' AND shipsDestroyed>'3' ORDER BY startedAt DESC;

 

.===============分隔符============================

问题:

 

后来,有添加了一个复合主键, 建表语句为:

CREATE TABLE altercations ( instigator text, startedAt text, shipsDestroyed text, energyUsed text, allianceInvolvement text, PRIMARY KEY (instigator, startedAt, shipsDestroyed, energyUsed) );

 查询语句:

SELECT * FROM altercations WHERE instigator='Jayne Cobb' AND startedAt = '7943-06-23' AND shipsDestroyed='3' AND energyUsed>'4.6' ORDER BY startedAt DESC;

 发现搜索出的结果完全混乱了,根本不是按条件查询出来的,如下:

 

instigator : Jayne Cobb;  startedat : 7943-06-24;  shipsdestroyed : 7;  energyused : 4.6;  allianceinvolvement : false;  gender : null;  
instigator : Jayne Cobb;  startedat : 7943-06-24;  shipsdestroyed : 6;  energyused : 4.6;  allianceinvolvement : false;  gender : null;  
instigator : Jayne Cobb;  startedat : 7943-06-24;  shipsdestroyed : 5;  energyused : 4.6;  allianceinvolvement : false;  gender : null;  
instigator : Jayne Cobb;  startedat : 7943-06-23;  shipsdestroyed : 4;  energyused : 4.6;  allianceinvolvement : false;  gender : null;  

 

还不清楚怎么回事! 主要就是 energyUsed>'4.6' 这个判断条件,改为 energyUsed='4.6' 是没问题的。

 

0
0
分享到:
评论

相关推荐

    分布式存储系统:Cassandra:Cassandra的高级特性:二级索引与轻量级事务.docx

    分布式存储系统:Cassandra:Cassandra的高级特性:二级索引与轻量级事务.docx

    Learning_Apache_Cassandra

    从描述中我们可以得知,文档中可能包括了为什么选择Cassandra而不是其他数据库系统的比较,Cassandra提供的核心特性,例如水平扩展性、高可用性、写优化、结构化记录、二级索引、高效结果排序、即时一致性、可离散...

    cassandra cql 3.1

    文档中提到了如何建立和维护索引,并且详细说明了何时应使用索引以及如何对索引进行使用。同时,文档也强调了对遗留应用程序的支持。 CQL查询是与Cassandra数据库交互的重要手段。文档指导用户如何启动cqlsh...

    Learning Apache Cassandra 2015

    - **复合主键**:复合主键是Cassandra中一种重要的特性,它可以用来表示父子关系,通过这种方式可以将相关数据组织在一起。 - **静态列**:静态列是在主键之外定义的列,它们对于所有行都是相同的。静态列可以用来...

    stratio-cassandra, 支持 Cassandra Lucene索引,已经停止.zip

    stratio-cassandra, 支持 Cassandra Lucene索引,已经停止 此外,这个项目不再支持Cassandra索引,它完全保持了与 Apache Cassandra的插件相同的功能,而不是一个 fork 插件。 值得注意的是,插件发行版比 fork 更...

    基于Cassandra的可扩展分布式反向索引的构建.pdf

    文章还对Cassandra的性能进行了测试,并对测试结果进行了分析,这为理解和实现基于Cassandra的分布式反向索引提供了参考。 在构建基于Cassandra的分布式反向索引过程中,需要考虑的关键技术包括数据分片、复制策略...

    CQL3.0 for Cassandra 1.2

    CQL(Cassandra Query Language)是为Apache Cassandra数据库设计的查询语言,它是一种类似于SQL的声明式语言,用于在Cassandra数据库中进行数据查询和管理操作。CQL3.0是CQL的第三个主要版本,其包含了一些新增特性...

    Practical Cassandra-带完整书签目录超清文字版.pdf

    6. **Secondary Indexes**:Cassandra允许为列创建二级索引,以支持非主键的查询,但需要注意二级索引可能影响写性能和额外的磁盘空间占用。 7. **Compaction策略**:为了管理和优化磁盘空间,Cassandra提供了多种...

    cassandra权威指南(中文)

    - **索引**:讲解Cassandra中索引的概念及其作用,包括二级索引和自定义索引的使用。 - **分区策略**:介绍Cassandra中的各种分区策略,如RandomPartitioner、Murmur3Partitioner等。 - **压缩与缓存**:探讨...

    cassandra cql3

    - **二级索引**:支持非主键列的查询。 - **构建和维护索引**:使用 `CREATE INDEX` 和 `DROP INDEX` 语句管理索引。 - **修改表**:使用 `ALTER TABLE` 语句。 - **修改列**:增加或删除列。 - **添加集合类型**...

    cassandra-3.11.3下载

    在解压"apache-cassandra-3.11.3"压缩包后,用户可以找到源代码、二进制文件、配置示例以及相关的用户手册,以便开始使用或进一步定制Cassandra。 总之,Cassandra 3.11.3是一个强大且成熟的分布式数据库系统,它在...

    DevCenter cassandra客户端

    用户可以通过图形化界面定义键空间(keyspaces)、列族(column families,Cassandra中的表)以及它们的字段,支持主键和索引的配置。 2. **CQL编辑器**:DevCenter内置了一个Cassandra查询语言(CQL)的编辑器,...

    基于协处理器的HBase内存索引机制的研究.pdf

    4. 内存索引机制:基于协处理器的HBase内存索引机制可以快速构建二级索引,并且可以根据HBase表的变化自动更新索引,提高HBase的查询效率和可用性。 5. 持久化操作:将建立的索引进行持久化操作,在使用时通过内存...

    cassandra 学习

    - **0.7版**(2011年1月发布):引入了二级索引和在线模式变更的能力。 - **0.8版**(2011年6月发布):增加了Cassandra查询语言(CQL)、自我调整的内存表以及零停机升级的支持。 - **1.0版**(2011年10月发布):...

    cassandra详解

    在数据模型方面,Cassandra采用行存储的方式,每行都有一个唯一的主键,可以是复合主键。这种设计使得数据可以高效地被分片和复制。数据的存储模型是基于列族(Column Family),类似于Bigtable或HBase中的表,可以...

    spring boot与cassandra集成,使用JPA方式。

    首先,让我们了解Spring Boot如何与Cassandra建立连接。在Spring Boot项目中,你需要在`pom.xml`或`build.gradle`文件中添加Cassandra和Spring Data Cassandra的相关依赖。对于Maven项目,可以添加以下依赖: ```...

    Cassandra查询分析器

    **Cassandra 查询分析器详解** Cassandra 查询分析器是 Apache Cassandra 数据库系统中的核心组件之一,它在数据查询过程中起着至关重要的作用。Cassandra 是一个分布式、高性能、可扩展的NoSQL数据库,广泛用于...

    Cassandra文档

    - 表(Table):由列族和索引构成,定义主键和列。 - CQL(Cassandra Query Language):类似SQL的查询语言,用于插入、查询、更新和删除数据。 4. **数据分布与复制** - 数据分区:使用分区键决定数据存储位置...

Global site tag (gtag.js) - Google Analytics