向所有Cassandra专家提问。
我有一个有大约一百万条记录的专栏系列。
我想查询这些记录,以便能够执行Not-Equal-To
种操作。
我用Google搜索,似乎我必须使用某种Map-Reduce
。
有人可以告诉我这方面有哪些选择。
答案 0 :(得分:12)
我可以建议一些方法。
1)如果您想要测试不相等的有限数量的值,请考虑将这些值建模为boolean
列(即:isEqualToUnitedStates
列为true或false)。
2)否则,请考虑通过在客户端组合两个单独查询!= X
和< X
的结果来模拟不受支持的查询> X
。
3)如果您的模式不能支持上述任何类型的查询,您可能不得不求助于编写将执行客户端过滤的自定义例程并动态构造不相等的集合。如果您可以先将搜索空间缩小到可管理的比例,这样就可以了,这样在没有不相等的情况下运行查询相对便宜。
因此,假设您对除Widget之外的每种产品类型的特定客户的所有购买感兴趣。一个理想的查询看起来像SELECT * FROM purchases WHERE customer = 'Bob' AND item != 'Widget';
当然,你不能运行它,但在这种情况下你应该能够运行SELECT * FROM purchases WHERE customer = 'Bob'
而不浪费太多资源并过滤item != 'Widget'
客户申请。
4)最后,如果在进行扫描之前没有办法以有意义的方式限制数据(没有相等性检查的查询将返回太多行以便舒适地处理),您可能不得不求助于MapReduce。这意味着运行分布式作业,该作业将跨群集扫描表中的所有行。这些作业显然比本机查询运行得慢很多,并且设置起来相当复杂。如果你想这样,请查看 Cassandra Hadoop集成。
答案 1 :(得分:0)
如果您想在特定分区键上使用不等于运算符并从表中获取所有其他数据,那么您可以使用 CQL 中的范围查询和 TOKEN 函数的组合来实现这一点
例如,如果要获取除分区键为“abc”的行以外的所有行,则执行以下 2 个查询
select <column1>,<column2> from <keyspace1>.<table1> where TOKEN(<partition_key_column_name>) < TOKEN('abc');
select <column1>,<column2> from <keyspace1>.<table1> where TOKEN(<partition_key_column_name>) > TOKEN('abc');
但是,请注意结果会很大(取决于您需要的表和字段的大小)。因此,您可能希望将其与 dsbulk 类实用程序结合使用。另请注意,不能保证在您的结果中进行排序。这只是一种数据转储,很可能对某些一次性数据迁移等场景很有用。