【问题标题】:Cassandra read from large datasetCassandra 从大型数据集中读取
【发布时间】:2018-07-11 01:53:28
【问题描述】:

我需要从 Cassandra 中的一个非常大的数据集中进行计数,超过 1 亿。如果我只运行以下查询,我担心 cassandra 会占用内存。

从 conv_org 中选择 count(*),其中 org_id = 'TEST_ORG'

有人告诉我可以使用 cassandra 自动分页来执行此操作?这似乎是一个不错的选择?

语法会像这样吗?

Statement stmt = new SimpleStatement("select count(*) from conv_org where org_id = 'TEST_ORG'");
stmt.setFetchSize(1000);
ResultSet rs = session.execute(stmt);

我不确定上面的代码是否有效,因为我不需要返回结果集,我只需要计数。

这是数据模型。

CREATE TABLE ts.conv_org (
   org_id text,
   create_time timestamp,
   test_id text,
   org_type int,
   PRIMARY KEY (org_id, create_time, conv_id)
)

【问题讨论】:

    标签: cassandra datastax


    【解决方案1】:

    如果org_id 不是您在 cassandra 中的主键计数,则通常不是快速操作,并且很容易导致对集群中的所有 sstable 进行全面扫描,因此速度非常慢。

    例如,在 Java 中,您可以执行以下操作:

       ResultSet rs = session.execute(...);
       Iterator<Row> iter = rs.iterator();
       while (iter.hasNext()) {
           if (rs.getAvailableWithoutFetching() == 100 && !rs.isFullyFetched())
               rs.fetchMoreResults();
           Row row = iter.next()
           ... process the row ...
       }
    

    https://docs.datastax.com/en/drivers/java/2.0/com/datastax/driver/core/ResultSet.html

    你可以选择一个小柱子并数你自己。 int getAvailableWithoutFetching()isFullyFetched() 可以帮助你。

    一般来说,如果您真的需要计数,请自行维护。

    另一方面,如果您在一个分区中确实有很多行,您可能还会遇到其他一些性能问题。

    但如果不了解数据模型,这很难说。

    【讨论】:

    • 我添加了数据模型,org_id 是主键的一部分。知道我应该将获取大小设置为什么吗?
    【解决方案2】:

    除了数据集之外,您可能还想使用“计数器表”。

    优点:快速反击。

    缺点:需要维护该表。

    参考: https://docs.datastax.com/en/cql/3.3/cql/cql_using/useCountersConcept.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-15
      • 2018-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-04
      • 2011-11-05
      • 2019-12-25
      相关资源
      最近更新 更多