【问题标题】:Cassandra NOT EQUAL OperatorCassandra 不等于运算符
【发布时间】:2014-03-22 10:36:25
【问题描述】:

向所有 Cassandra 专家提问。

我有一个包含大约一百万条记录的列族。

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

我在 Google 上搜索过,看来我必须使用某种 Map-Reduce

谁能告诉我在这方面有哪些可用的选项。

【问题讨论】:

    标签: mapreduce cassandra cql3


    【解决方案1】:

    我可以提出一些方法。

    1) 如果您想要测试不相等的值数量有限,请考虑将它们建模为 boolean 列(即:isEqualToUnitedStates 列,具有真或假)。

    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 集成

    【讨论】:

      【解决方案2】:

      如果您想在特定分区键上使用不等于运算符并从表中获取所有其他数据,那么您可以结合使用范围查询和 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 类型的实用程序结合使用。另请注意,不能保证您的结果是有序的。这只是一种数据转储,很可能对某种一次性数据迁移等场景很有用。

      【讨论】:

        猜你喜欢
        • 2013-10-22
        • 2011-05-04
        • 2012-09-03
        • 2016-07-29
        • 1970-01-01
        • 2012-11-28
        • 2011-08-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多