最近在使用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' 是没问题的。
分享到:
相关推荐
分布式存储系统:Cassandra:Cassandra的高级特性:二级索引与轻量级事务.docx
从描述中我们可以得知,文档中可能包括了为什么选择Cassandra而不是其他数据库系统的比较,Cassandra提供的核心特性,例如水平扩展性、高可用性、写优化、结构化记录、二级索引、高效结果排序、即时一致性、可离散...
文档中提到了如何建立和维护索引,并且详细说明了何时应使用索引以及如何对索引进行使用。同时,文档也强调了对遗留应用程序的支持。 CQL查询是与Cassandra数据库交互的重要手段。文档指导用户如何启动cqlsh...
- **复合主键**:复合主键是Cassandra中一种重要的特性,它可以用来表示父子关系,通过这种方式可以将相关数据组织在一起。 - **静态列**:静态列是在主键之外定义的列,它们对于所有行都是相同的。静态列可以用来...
stratio-cassandra, 支持 Cassandra Lucene索引,已经停止 此外,这个项目不再支持Cassandra索引,它完全保持了与 Apache Cassandra的插件相同的功能,而不是一个 fork 插件。 值得注意的是,插件发行版比 fork 更...
文章还对Cassandra的性能进行了测试,并对测试结果进行了分析,这为理解和实现基于Cassandra的分布式反向索引提供了参考。 在构建基于Cassandra的分布式反向索引过程中,需要考虑的关键技术包括数据分片、复制策略...
CQL(Cassandra Query Language)是为Apache Cassandra数据库设计的查询语言,它是一种类似于SQL的声明式语言,用于在Cassandra数据库中进行数据查询和管理操作。CQL3.0是CQL的第三个主要版本,其包含了一些新增特性...
6. **Secondary Indexes**:Cassandra允许为列创建二级索引,以支持非主键的查询,但需要注意二级索引可能影响写性能和额外的磁盘空间占用。 7. **Compaction策略**:为了管理和优化磁盘空间,Cassandra提供了多种...
- **索引**:讲解Cassandra中索引的概念及其作用,包括二级索引和自定义索引的使用。 - **分区策略**:介绍Cassandra中的各种分区策略,如RandomPartitioner、Murmur3Partitioner等。 - **压缩与缓存**:探讨...
- **二级索引**:支持非主键列的查询。 - **构建和维护索引**:使用 `CREATE INDEX` 和 `DROP INDEX` 语句管理索引。 - **修改表**:使用 `ALTER TABLE` 语句。 - **修改列**:增加或删除列。 - **添加集合类型**...
在解压"apache-cassandra-3.11.3"压缩包后,用户可以找到源代码、二进制文件、配置示例以及相关的用户手册,以便开始使用或进一步定制Cassandra。 总之,Cassandra 3.11.3是一个强大且成熟的分布式数据库系统,它在...
用户可以通过图形化界面定义键空间(keyspaces)、列族(column families,Cassandra中的表)以及它们的字段,支持主键和索引的配置。 2. **CQL编辑器**:DevCenter内置了一个Cassandra查询语言(CQL)的编辑器,...
4. 内存索引机制:基于协处理器的HBase内存索引机制可以快速构建二级索引,并且可以根据HBase表的变化自动更新索引,提高HBase的查询效率和可用性。 5. 持久化操作:将建立的索引进行持久化操作,在使用时通过内存...
- **0.7版**(2011年1月发布):引入了二级索引和在线模式变更的能力。 - **0.8版**(2011年6月发布):增加了Cassandra查询语言(CQL)、自我调整的内存表以及零停机升级的支持。 - **1.0版**(2011年10月发布):...
在数据模型方面,Cassandra采用行存储的方式,每行都有一个唯一的主键,可以是复合主键。这种设计使得数据可以高效地被分片和复制。数据的存储模型是基于列族(Column Family),类似于Bigtable或HBase中的表,可以...
首先,让我们了解Spring Boot如何与Cassandra建立连接。在Spring Boot项目中,你需要在`pom.xml`或`build.gradle`文件中添加Cassandra和Spring Data Cassandra的相关依赖。对于Maven项目,可以添加以下依赖: ```...
**Cassandra 查询分析器详解** Cassandra 查询分析器是 Apache Cassandra 数据库系统中的核心组件之一,它在数据查询过程中起着至关重要的作用。Cassandra 是一个分布式、高性能、可扩展的NoSQL数据库,广泛用于...
- 表(Table):由列族和索引构成,定义主键和列。 - CQL(Cassandra Query Language):类似SQL的查询语言,用于插入、查询、更新和删除数据。 4. **数据分布与复制** - 数据分区:使用分区键决定数据存储位置...