Go客户端中bigquery的分页

zxlwwiss  于 2023-05-11  发布在  Go
关注(0)|答案(1)|浏览(132)
rawQuery := "SELECT num FROM UNNEST(GENERATE_ARRAY(1, 25)) num;"
query := bqClient.Query(rawQuery)
it, err := query.Read(ctx)
if err != nil {
    panic(err) // for brevity
}

for {
    var row myObject

    it.PageInfo().Token = token
    if err := it.Next(&row); err != nil {
        if errors.Is(err, iterator.Done) {
            break
    }
        return nil, "", err
    }

    nextToken = it.PageInfo().Token

    out = append(out, row)
    token = nextToken
    }

文档here读起来像PageInfo().Token的值应该每N(在本例中为5)更改一次,或者简单地说,每一个新页面都应该更改一次。
然而,发生的情况是迭代器只是不断地向我的切片(out)追加行,即使在内部我可以看到有一个名为“rows”的字段,其缓冲区为N
我想实现的是批量阅读BQ中的行,这样我就可以指定MaxSize和一个空字符串token,然后通过更新token的值来执行某种基于光标的分页。出于某种原因,目前它并不这样工作。

v6ylcynt

v6ylcynt1#

事实是,库生成的标记在字典上如此相似,以至于我被愚弄了。
详细说明一下解决方案:为了在BigQuery中实现基于指针的分页,我们可以做以下事情:
1.以token的空字符串开始,设置iterator.PageInfo().MaxSize = pageSize(幸运的是,这是可配置的)
1.迭代iterator.Next(&dst)并将每个dst追加到最后的sliceOfDst,只要len(sliceOfDst) < pageSize
1.获取iterator.PageInfo().Token的新值并再次从(1)开始,这次是在将`iterator.PageInfo().Token设置为该值之后
这个流程对我来说工作得很好,允许批量处理一个大表,而不需要使用基于limit/offset的分页。

相关问题