如何在 cassandra 查询中的 timeuuid 列上应用 "not equal to" ( != ) 运算符?

How to apply "not equal to" ( != ) operator on timeuuid column on cassandra query?

我在 cassandra table 中有一列包含 timeuuid 值。我想在搜索查询中排除具有 timeuuid 值的行。如果我应用 '!=',我会收到以下错误

查询:

select * from X where id != '0651de16-fa62-11eb-8318-dc4a3e6d5697 ' allow filtering ;

错误:

InvalidRequest: Error from server: code=2200 [Invalid query] message="Unsupported "!=" relation: id != '0651de16-fa62-11eb-8318-dc4a3e6d5697

我知道我不能对 timeuuid 值应用“!=”。那么如何在搜索时排除某个timeuuid值呢?

I got that I can't apply '!=' on timeuuid values.

它不仅仅适用于时间 UUID。 CQL 中不存在不等于运算符 (!=)。

搜索与查询

I want to exclude a row with a timeuuid value in a search query.

首先,搜索和查询不是一回事。 查询 涉及使用特定标准拉回已知大小的结果集。另一方面,正在使用非常宽松的标准搜索 returns 大小未知的结果集。

理解这种差异很重要,因为 Cassandra 是为支持查询而构建的。并且非常具体的查询。不幸的是,这个用例需要 Cassandra 执行 random 读取(而不是顺序读取)。事实上,Cassandra 并不是为支持随机读取模式而设计的。

由于 Cassandra 的分布式特性,它也不能很好地处理 table 完整扫描。从本质上讲,查询时间变成了网络时间(对于结果集中的每个分区),而且 never 会很快。

这就是为什么 CQL 中不存在不等于运算符的原因。因为 Cassandra 无法使用“不等于”标准来隔离特定分区或节点。

也就是说,有一些可用的解决方案:

  • 像 Apache Spark 这样的分布式分析层可以 运行 该查询。
  • 如果只是需要排除一次或几次UUID,那么也许这可以在应用层完成。
  • 对于纯 Cassandra 解决方案,构建查询以拉回您真正想要的 ids。这对 Cassandra 来说要容易得多,而不是告诉 Cassandra 你想要什么。

注意:ALLOW FILTERING 指令应该永远不会 用于生产系统。 Cassandra 的想法是构建 tables 以支持预期的已知查询。有时可能需要将数据复制到一个或多个“查询 table”,这没关系。