【问题标题】:Cassandra: How to query the complete data set?Cassandra:如何查询完整的数据集?
【发布时间】:2015-01-20 11:32:23
【问题描述】:

我的表有 77k 个条目(条目数一直在以很高的速度增加),我需要在 CQL 3 中进行选择查询。当我执行 select count(*) ... where (some_conditions) allow filtering 时,我得到:

 count
-------
 10000

(1 rows)

Default LIMIT of 10000 was used. Specify your own LIMIT clause to get more results. 

假设 23k 行满足 some_condition。上面的 10000 计数是这 23k 行中的前 10k 行,对吗?但是我如何获得实际计数?

更重要的是,我如何访问所有这 23k 行,以便我的 python api 可以对行的某些列中的数据执行一些内存操作。 Cassandra CQL 3 中是否有某种分页原则。

我知道我可以将限制增加到一个非常大的数字,但这并不有效。

【问题讨论】:

    标签: python-2.7 cassandra cql3


    【解决方案1】:

    Working Hard 是对的,LIMIT 可能就是你想要的。但是,如果您想更详细地“分页”浏览您的结果,请通读此 DataStax 文档,标题为:Paging through unordered partitioner results

    这将涉及在您的分区键上使用token 函数。如果您需要更详细的帮助,则必须发布您的架构。

    虽然我看不到您的完整表架构,但由于您使用的是ALLOW FILTERING,我可以看出您做错了什么。 Cassandra 并非旨在为基于多个二级索引的数据提供服务。这种方法可能适用于 RDBMS,但随着时间的推移,查询会变得非常慢。您应该真正设计一个列族(表)以适合您打算经常使用的每个查询。 ALLOW FILTERING 不是长期解决方案,应该永远在生产系统中使用。

    【讨论】:

      【解决方案2】:

      您只需在查询中指定限制。

      假设您的数据库包含少于 1 条缺失记录,因此如果您执行以下查询,它将为您提供表中记录的实际计数。

      select count(*) ... where (some_conditions) 允许过滤限制100000;

      【讨论】:

      • 但是这是一种有效的方法吗?这是针对where 子句查询的结果或数据集的限制。似乎它是对结果行的限制,而不是要查询的数据集。因为如果它在数据集上,那么表中的所有前 10k 个整体都不太可能满足 where 子句中的条件。 @努力工作..
      • 它在结果集上,您可以使用带或不带 where 子句的任何查询指定限制。我更新了我的答案。检查一下。
      • @extraDarker 如果您真的担心效率,那么您应该重组您的查询/模型以摆脱ALLOW FILTERING
      【解决方案3】:

      另一种方式是写python代码,cqlsh确实是python脚本。

      使用

      statement = " select count(*) from SOME_TABLE"

      未来 = session.execute_async(statement)

      rows = future.result()

      计数 = 0 对于行中的行: 计数 = 计数 + 1

      以上是使用 cassandra python 驱动程序 PAGE QUERY 功能。

      【讨论】:

        猜你喜欢
        • 2012-10-08
        • 2012-12-30
        • 2017-02-04
        • 2013-05-15
        • 2013-06-01
        • 2012-05-01
        • 1970-01-01
        • 2022-12-15
        • 2022-01-26
        相关资源
        最近更新 更多