Cassandra 通过主键查询和列抛出错误

Posted

技术标签:

【中文标题】Cassandra 通过主键查询和列抛出错误【英文标题】:Cassandra query by primary key and a column throws error 【发布时间】:2019-04-27 03:48:22 【问题描述】:

架构

CREATE TABLE books (
   isbn text PRIMARY KEY,
   author text
);

insert into books (isbn, author) values ('111', 'Sally');
insert into books (isbn, author) values ('112', 'Fred');
insert into books (isbn, author) values ('113', 'Joe');

有了以上数据,我就可以通过主键111查询了

select * from books where isbn = '111';

但是,当我将 author 置于 where 条件时,它会引发错误

select * from books where isbn = '111' and author = 'Fred';

Query 1 ERROR: Cannot execute this query as it might involve data filtering and thus may have unpredictable performance. If you want to execute this query despite the performance unpredictability, use ALLOW FILTERING

我无法理解,如果数据已经被主键过滤(只有一条记录)为什么会抛出错误?

其次,如果我使用allow filtering,对性能有影响吗?

编辑:https://dzone.com/articles/apache-cassandra-and-allow-filtering 给了我一些线索。

【问题讨论】:

【参考方案1】:

这个link 可能会对您有所帮助。据我了解,如果你 allow filtering 会影响 cassandra 的性能(猜测它类似于 SQL RBAR,它很慢,以及为什么它会抛出和过滤错误)

我对 cassandra 还比较陌生,但根据我的阅读,如果您没有定义二级索引,您需要运行选择查询以包含主键中定义的所有列。但是二级索引也有局限性。

HTH 祝你好运。

【讨论】:

【参考方案2】:

在 Cassandra 中,您无法查询非分区或集群键列。

如果您希望上述用例能够正常工作,则必须将作者包含在您的主键声明中。

创建表格书籍( isbn文本, 作者文字, 主键(isbn,作者) )

注意:使用此数据模型,您必须始终使用 isbn 进行查询,但作者是可选的。

您不应使用允许过滤。会有性能影响。

如何在 cassandra 中声明分区键和集群键非常重要,应该在逐个查询的基础上使用。如果您有一个新的用例来查询相同的数据但在不同的 where 子句中,请创建一个新表! :D

【讨论】:

以上是关于Cassandra 通过主键查询和列抛出错误的主要内容,如果未能解决你的问题,请参考以下文章

DataTable - 附加附加列抛出一些异常错误

即使将其标记为已计算,计算列抛出也无法更新错误

Cassandra Spring Data不允许我直接通过复合主键查询数据

当该列包含空值时格式化列抛出异常

使用FlatFileItemReader读取csv文件,遇到空列抛出异常

如何识别列抛出 System.Data.SqlClient.SqlException? (将 datetime2 数据类型转换为 datetime 数据类型)