向所有 Cassandra 专家提出问题。
我有一个列族,有大约一百万条记录。
我想以能够执行 Not-Equal-To
类操作的方式查询这些记录。
我对此进行了谷歌搜索,似乎我必须使用某种 Map-Reduce
。
有人可以告诉我在这方面有哪些可用的选择。
最佳答案
我可以建议一些方法。
1)如果您想要测试不相等的值数量有限,请考虑将它们建模为 boolean
列(即:列 isEqualToUnitedStates
为真或假)。
2) 否则,考虑通过在客户端组合两个单独查询 != X
和 < X
的结果来模拟不受支持的查询 > X
。
3) 如果您的架构不能支持上述任一类型的查询,您可能不得不求助于编写自定义例程来进行客户端过滤并动态构造不等集。如果您可以首先将搜索空间缩小到可管理的比例,这将起作用,这样在没有 not-equal 的情况下运行查询相对便宜。
因此,假设您对除 Widget 之外的每种产品类型的特定客户的所有购买感兴趣。一个理想的查询可能看起来像 SELECT * FROM purchases WHERE customer = 'Bob' AND item != 'Widget';
现在当然,您不能运行它,但在这种情况下,您应该能够运行 SELECT * FROM purchases WHERE customer = 'Bob'
而不浪费太多资源并在客户端应用程序中过滤 item != 'Widget'
。
4) 最后,如果在进行扫描之前没有办法以有意义的方式限制数据(没有相等性检查的查询将返回太多行而无法轻松处理),您可能不得不求助于 MapReduce。这意味着运行一个分布式作业,该作业将扫描整个集群表中的所有行。此类作业的运行速度显然比 native 查询慢得多,并且设置起来非常复杂。如果您想这样做,请查看 Cassandra Hadoop 集成。
关于mapreduce - Cassandra NOT EQUAL 运算符,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21925525/