【问题标题】:Cassandra C# Driver get all record form tableCassandra C# Driver 获取所有记录表
【发布时间】:2020-12-16 07:10:16
【问题描述】:

我试图从 Cassandra 表中获取所有记录,但只获取 5000 行。有什么方法可以将所有结果从表格中获取?

以下是版本详情:
是驱动版本3.11.0
我的服务器版本是 [cqlsh 5.0.1 |卡桑德拉 3.11.4 | CQL 规范 3.4.4 |原生协议 v4]

下面是我的代码

//Create a cluster instance using 3 cassandra nodes.
var cluster = Cluster.Builder()
.AddContactPoints("xx.xx.xx.xx")
 .Build();
var session = cluster.Connect("keyspace");
var rs = session.Execute("select * from table ALLOW FILTERING");
ini i=0;
 foreach (var row in rs)
 {
    i++;
}

i 的值始终为 5000。我尝试实现分页以获取所有数据,但无法做到。

 while (!rs.IsFullyFetched)
 {
     rs.FetchMoreResults();
     foreach (var row in rs)
     {
         i++;
     }
 }

我仍然得到相同的结果

还尝试关注 URL https://docs.datastax.com/en/developer/csharp-driver/3.13/features/paging/ 但这也不起作用,因为我没有使用任何过滤器。
但是当我尝试引入过滤器时,结果是 0 行。

    var ps = session.Prepare("select * from table where state = ? ALLOW FILTERING");
    //// Set the page size at statement level.
    var statement = ps.Bind("xyz").SetPageSize(1000);
    var rs = session.Execute(statement);
    var i = 0;
    foreach (var row in rs)
    {
       i++;
    }

有特定状态的记录,但没有得到任何数据。记录数为零。
之前我的驱动版本也有问题
Query Cassandra form C# no result is shown

【问题讨论】:

  • 您是否尝试在查询中指定大于 5000 的 LIMIT?例如select * from table LIMIT 50000 ALLOW FILTERING。 ref cql 3.x doc .. 注意:使用 PER PARTITION LIMIT 部分控制返回的行数
  • 关于“也在尝试 [paging] 但这也不起作用,因为我没有使用任何过滤器”.. 我不明白您关于不使用任何过滤器的评论;您的查询指定了 ALLOW FILTERS,如果您表达它,则 LINQ 表达式本身应该使用过滤器构建\生成查询命令。但这可能无关紧要......我的第一个问题是,你的表中的数据是否有一个名为 state 的列有'xyz'?第二,你有没有像 sn-p 说的那样尝试.SetAutoPage(false)?此外,为避免不必要地查询列,请尝试 ... table 1 = ?ps.Bind(1)
  • @BrettCaswell 当我设置statement.SetAutoPage(false);statement.SetPageSize(1000); 时分页不起作用我没有得到超过1000 的数据。我试图查看Console.WriteLine(rs.IsExhausted());Console.WriteLine(rs.IsFullyFetched);Console.WriteLine(rs.PagingState); 的值,这表明没有剩余数据了.
  • 我问了三个问题 - 你真的只回答了一个......你回答它的方式引起了人们的关注。我不知道这个问题与您的问题有多相关,但statement.SetAutoPage(false);statement.SetPageSize(1000); 应该表示为var newStatement = statement.SetAutoPage(false).SetPageSize(1000);。这些方法不应被视为变异statement,或IStatement 的实例;它应该被认为是创建 \ 返回一个新的 IStatement 实例。
  • @brett 相同的代码首先开始工作。我不确定如何。在这之间,我在查询中将一致性级别更改为 ALL。并运行它几次失败。我还更改了一些查询设置。当我检查信件时,它开始正常工作。

标签: c# cassandra-3.0


【解决方案1】:

默认情况下,fetchsize 设置为 5000,以防止应用程序在单个响应中意外检索大型结果集,也许你可以使用 .setFetchSize(int) 属性

【讨论】:

  • 我认为C#中没有这样的方法,你可以参考一些链接放一些代码。
  • “[屏蔽] 应用程序以防意外检索大型结果集”...您从哪里获得这种“奇怪”的推理和信息?我读过的关于这个问题的大部分内容都没有描述默认的推理(它们似乎是在驱动程序的上下文中,而不是服务器或本机)。如果未指定,则结果集中的行数将根据操作超时而有所不同。我希望默认 LIMIT 的实际推理更多地是关于相当高延迟操作的一致性。
猜你喜欢
  • 2018-03-28
  • 2013-09-12
  • 1970-01-01
  • 1970-01-01
  • 2015-03-20
  • 1970-01-01
  • 1970-01-01
  • 2020-01-30
  • 2017-05-13
相关资源
最近更新 更多