BigQuery Golang最大查询结果数

ehxuflar  于 2022-12-07  发布在  Go
关注(0)|答案(2)|浏览(142)

我希望在使用golang BigQuery库时能够指定maxResults。但不清楚如何做到这一点。我在文档中没有看到它是一个选项,我浏览了源代码试图找到它,但我只看到一些零星的用法,似乎与查询无关。有没有办法解决这个问题?

cgh8pdjw

cgh8pdjw1#

我认为SDK中没有实现的方法,但在查看了一下之后,我发现了以下方法:请求
您可以尝试执行指定参数的HTTP GET(您可以在此处找到使用参数的示例:查询参数)

42fyovps

42fyovps2#

默认情况下,google API迭代器会为你管理页面大小,RowIterator默认返回一行,内部由获取的页面支持,这些页面依赖于后端来选择合适的大小。
但是,如果要指定固定的最大页面大小,可以使用google.golang.org/api/iterator包在指定特定大小的同时按页面进行迭代。在本例中,该大小对应于BigQuery的查询API的maxResults
有关高级迭代器用法的更多一般信息,请参见https://github.com/googleapis/google-cloud-go/wiki/Iterator-Guidelines
下面是bigquery中RowIterator的一个快速测试,它执行一个查询,返回10月份的每一天的一行,并按页迭代:

func TestQueryPager(t *testing.T) {
    ctx := context.Background()

    pageSize := 5

    client, err := bigquery.NewClient(ctx, "your-project-id here")
    if err != nil {
        t.Fatal(err)
    }
    defer client.Close()

    q := client.Query("SELECT * FROM UNNEST(GENERATE_DATE_ARRAY('2022-10-01','2022-10-31', INTERVAL 1 DAY)) as d")
    it, err := q.Read(ctx)
    if err != nil {
        t.Fatalf("query failure: %v", err)
    }
    pager := iterator.NewPager(it, pageSize, "")
    var fetchedPages int
    for {
        var rows [][]bigquery.Value
        nextToken, err := pager.NextPage(&rows)
        if err != nil {
            t.Fatalf("NextPage: %v", err)
        }
        fetchedPages = fetchedPages + 1
        if len(rows) > pageSize {
            t.Errorf("page size exceeded, got %d want %d", len(rows), pageSize)
        }
        t.Logf("(next token %s) page size: %d", nextToken, len(rows))
        if nextToken == "" {
            break
        }
    }

    wantPages := 7
    if fetchedPages != wantPages {
        t.Fatalf("fetched %d pages, wanted %d pages", fetchedPages, wantPages)
    }
}

相关问题