【问题标题】:Cassandra - Iterate through table rowsCassandra - 遍历表行
【发布时间】:2017-10-05 21:29:45
【问题描述】:

我的目标是浏览我的 cassandra 数据库,其中的每个条目,并检查某个字段以查看我是否需要执行操作。我正在使用这里找到的 erlang cql 驱动程序:https://github.com/matehat/cqerl

当我在 2000 的表中运行 select * from keyspace.table limit 10; 时,我得到了前 10 个结果...但是我需要得到下一个 1990。我如何使用 CQL 得到下一个 10?我看到支持分页,但没有关于如何在 cql 中执行此操作的文档。

我对这个问题进行了广泛的研究,似乎关于该主题的唯一答案是不完整的,许多对这些问题的评论者没有收到他们正在寻找的答案:Iterating through Cassandra wide row with CQL3

提前感谢您的帮助!

【问题讨论】:

  • 删除limit 10,您将获得所有记录。如果你想跳过一些计数 - 使用 skip 而不是 limit
  • 我不想加载所有这些是关键 - 如果我有 1000 万条记录都加载到我的内存中,我会遇到问题。我一次想要 10、20、100、X 的数量。因此,我将在表格中“迭代”。
  • 哦,我明白了。在#cql_query 中设置page_size 并使用自述文件中的代码(分页部分)。
  • @Atomic_alarm 这工作得很好!谢谢你。我将发布一个关于我的确切方法的答案,当你发布一个时我会接受你的。
  • 不,最好自己写。

标签: cassandra pagination erlang cql


【解决方案1】:

感谢@Atomic_alarm,我找到了答案。

这里的文档:https://www.datastax.com/dev/blog/client-side-improvements-in-cassandra-2-0 指定如何使用 CQL 进行自动分页。

我没有像文档说的那样使用 cql 命令行,而是使用了 erlang 驱动程序代码。首先我将 1000 行插入到一个表中,然后我运行下面的函数。它遍历所有 1000 个结果,一次 2 页:

test_page() ->
       {ok, Client} = cqerl:get_client({}),
       {ok, Res} = cqerl:run_query(Client, #cql_query{statement = "SELECT * FROM dks.devices;",
                       page_size = 2}),
       get_more(Res, 0).
   get_more(Res, Num) ->
       case cqerl:has_more_pages(Res) of
           true ->
               {ok, Res2} = cqerl:fetch_more(Res),
               get_more(Res2, Num+1);
           false -> 
               Num
       end.

【讨论】:

    猜你喜欢
    • 2013-07-13
    • 2013-08-16
    • 1970-01-01
    • 2011-07-19
    • 1970-01-01
    • 2016-04-16
    • 2016-04-15
    • 2020-08-27
    相关资源
    最近更新 更多