【问题标题】:Figuring out Page State with Cassandra GOCQL Driver (Golang)使用 Cassandra GOCQL 驱动程序 (Golang) 确定页面状态
【发布时间】:2019-03-01 00:21:39
【问题描述】:

我一直在努力思考如何在 Apache Cassandra 中使用 GOlang 中的驱动程序函数进行分页。

我有以下用于获取行的代码

/// Assume all other prerequisites.

session, _ := cluster.CreateSession()

session.SetPageSize(100)
var pagestate []byte

query := session.Query(`select * from keyspace.my_table`)

query = query.PageState(pagestate)
if err := query.Exec(); != nil {
   panic(err)
}

iter := query.Iter()

for {
   row := map[string]interface{}{}
   if !iter.MapScan(row) {
      pagestate = iter.PageState()
      break
   }

   /// Do whatever I need with row.

}

我想要达到的目标: 我引用的表很大,超过 18k 行,我想使用驱动程序的内置分页以最有效的方式获取所有这些表以进行特殊操作,这样查询就不会超时。

问题: 我不确定如何让查询恢复到前一页状态。我不确定这是否涉及在循环中运行查询并在其外部管理页面状态。我了解如何获取和设置页面状态,但在所有分页完成后,如果没有适当的停止条件,我无法弄清楚如何每次使用新页面状态迭代查询。

我的最佳尝试:

var pagestate []byte

query := session.Query(`select * from keyspace.my_table`)

for {
   query = query.PageState(pagestate)
   if err := query.Exec(); != nil {
      panic(err)
   }

   iter := query.Iter()

   /// I don't know if I'm using this bool correct or not.
   /// My assumption is that this would return false when a new page isn't
   /// avaliable, thus meaning that all the pages have been filled and
   /// the loop can exit.
   if !iter.WillSwitchPage() {
      break
   }

   for {
      row := map[string]interface{}{}
      if !iter.MapScan(row) {
         pagestate = iter.PageState()
         break
      }

      /// Do whatever I need with row.
   }
}

我这样做对吗,还是有更好的方法来实现这一点?

【问题讨论】:

    标签: go cassandra gocql page-state


    【解决方案1】:

    因此,事实证明,WillSwitchPage() 在循环中的任何时候都不会返回 true。不知道为什么。我想这是因为我如何使用MapScan() 来控制内部循环。

    无论如何,我通过在 en dof 查询循环中检查页面状态本身的 []byte 找到了一个解决方案。如果驱动程序到达末尾并且没有填满页面,页面状态将有 0 个元素,所以我使用它作为我的停止条件。这可能是也可能不是处理驱动程序分页的最优雅或预期的方式,但它可以按需要运行。

    var pagestate []byte
    
    query := session.Query(`select * from keyspace.my_table`)
    
    for {
       query = query.PageState(pagestate)
       if err := query.Exec(); != nil {
          panic(err)
       }
    
       iter := query.Iter()
    
       for {
          row := map[string]interface{}{}
          if !iter.MapScan(row) {
             pagestate = iter.PageState()
             break
          }
    
          /// Do whatever I need with row.
       }
    
       if len(pagestate) == 0 {
          break
       }
    }
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-21
    • 2019-02-15
    • 2018-04-24
    • 2018-03-24
    • 2016-06-11
    • 2022-07-25
    • 2019-10-26
    • 2019-10-27
    相关资源
    最近更新 更多