2014-02-21 12 views
9

问题给所有卡桑德拉专家。Cassandra NOT EQUAL运营商

我有一个列族约一百万条记录。

我想以这样的方式查询这些记录,我应该能够执行Not-Equal-To类型的操作。

我在此谷歌搜索,似乎我必须使用某种Map-Reduce

有人能告诉我在这方面可用的选项。

回答

11

我可以建议一些方法。 1)如果您想要测试不相等的值的数量有限,请考虑将它们建模为boolean列(即:带有true或false的列isEqualToUnitedStates)。

2)否则,请考虑通过组合客户端上的两个单独查询< X> X的结果来模拟不支持的查询!= X。 3)如果你的模式不能支持上述任何一种查询,你可能不得不求助于编写自定义例程,这些例程将执行客户端过滤并动态构建不等于集合。如果您可以首先将搜索空间缩小到可管理的比例,那么这将起作用,这样在没有不平等的情况下运行查询相对便宜。

因此,假设您对购买除Widget以外的每种产品类型的特定客户都感兴趣。理想的查询可能看起来像SELECT * FROM purchases WHERE customer = 'Bob' AND item != 'Widget';现在当然,你无法运行此,但在这种情况下,你应该能够无需在客户端应用程序浪费了太多的资源和过滤item != 'Widget'运行SELECT * FROM purchases WHERE customer = 'Bob'。最后,如果在执行扫描之前没有办法限制数据的使用(查询时没有相等性检查会返回太多的行以便轻松处理),那么您可能不得不求助于MapReduce。这意味着运行一个分布式作业,可以扫描群集中表中的所有行。这样的工作显然比原生查询运行慢很多,并且设置起来相当复杂。如果你想这样,请看看Cassandra Hadoop集成