Cassandra - 没有返回行

Cassandra - No Rows Returned

这是我的 Table:

CREATE TABLE mytable
(
    id uuid,
    day     text,
    mytime      timestamp, 
    value       text,
    status      int,

PRIMARY KEY ((id, day), mytime )
)
WITH CLUSTERING ORDER BY (mytime desc)
;

这是索引:

CREATE INDEX IF NOT EXISTS idx_status ON mytable (status);

当我运行这个select语句时,我得到了预期的结果:

select * from mytable 
where id = 38403e1e-44b0-11e4-bd3d-005056a93afd 
AND day = '2014-10-29'
;

此查询返回 62 行。

如果我添加到此查询以包含索引列:

select * from mytable 
where id = 38403e1e-44b0-11e4-bd3d-005056a93afd 
AND day = '2014-10-29'
AND status = 5
;

返回零行。 (有几条status = 5的记录)

如果我查询 table...仅查找特定索引值:

select * from mytable 
where status = 5
;

也返回零行。

我很茫然。我不明白到底发生了什么。

我在一个 3 节点集群上,复制级别 3。Cassandra 2.1.3

这可能是配置问题吗..在 cassandra.yaml 中?

或者...我的 select 声明有问题吗?

感谢您的帮助,谢谢。

更新:

我在 system.log 文件中看到了这个,有想法吗? ...

ERROR [CompactionExecutor:1266] 2015-03-24 15:20:26,596 CassandraDaemon.java:167 - Exception in thread Thread[CompactionExecutor:1266,1,main]
java.lang.AssertionError: /cdata/cassandra/data/my_table-c5f756b5318532afb494483fa1828675/my_table.idx_status-ka-32-Data.db
    at org.apache.cassandra.io.sstable.SSTableReader.getApproximateKeyCount(SSTableReader.java:235) ~[apache-cassandra-2.1.3.jar:2.1.3]
    at org.apache.cassandra.db.compaction.CompactionTask.runMayThrow(CompactionTask.java:153) ~[apache-cassandra-2.1.3.jar:2.1.3]
    at org.apache.cassandra.utils.WrappedRunnable.run(WrappedRunnable.java:28) ~[apache-cassandra-2.1.3.jar:2.1.3]
    at org.apache.cassandra.db.compaction.CompactionTask.executeInternal(CompactionTask.java:76) ~[apache-cassandra-2.1.3.jar:2.1.3]
    at org.apache.cassandra.db.compaction.AbstractCompactionTask.execute(AbstractCompactionTask.java:59) ~[apache-cassandra-2.1.3.jar:2.1.3]
    at org.apache.cassandra.db.compaction.CompactionManager$BackgroundCompactionTask.run(CompactionManager.java:240) ~[apache-cassandra-2.1.3.jar:2.1.3]
    at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) ~[na:1.7.0_51]
    at java.util.concurrent.FutureTask.run(Unknown Source) ~[na:1.7.0_51]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) [na:1.7.0_51]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) [na:1.7.0_51]
    at java.lang.Thread.run(Unknown Source) [na:1.7.0_51]

我 运行 你上面的步骤并且能够通过 status=5 查询行就好了。我可以建议的一件事是尝试重建索引。从命令提示符试试这个:

nodetool rebuild_index mykeyspace mytable idx_status

否则,IMO 解决此问题的最佳方法是 使用二级索引。如果您知道 status 必须支持查询(尤其是大型数据集),那么我会认真考虑为其构建一个特定的附加 "query table"。

CREATE TABLE mytablebystatus (id uuid, day text, mytime timestamp, value text, status int, 
PRIMARY KEY ((status),day,mytime,id));

这将仅支持按 status 或按 mytime 排序的 statusday 的查询。总之,我会尝试一些不同的 PRIMARY KEY 定义,看看哪个更适合您的查询模式。这样,您就可以避免同时使用性能不佳的二级索引。