为了账号安全,请及时绑定邮箱和手机立即绑定

BigQuery - 获取 1000000 条记录并使用 goLang 对数据进行一些处理

BigQuery - 获取 1000000 条记录并使用 goLang 对数据进行一些处理

Go
宝慕林4294392 2023-06-19 15:47:54
我在 BigQuery 中有 1000000 条记录。从数据库中获取数据并使用 goLang 进行处理的最佳方法是什么?如果无限制地获取所有数据,我会遇到超时问题。我已经将限制增加到 5 分钟,但它需要超过 5 分钟。我想做一些流式调用或分页实现,但我不知道在 golang 中我该怎么做。var FetchCustomerRecords = func(req *http.Request) *bigquery.RowIterator {    ctx := appengine.NewContext(req)    ctxWithDeadline, _ := context.WithTimeout(ctx, 5*time.Minute)    log.Infof(ctx, "Fetch Customer records from BigQuery")    client, err := bigquery.NewClient(ctxWithDeadline, "ddddd-crm")    q := client.Query(        "SELECT * FROM Something")    q.Location = "US"    job, err := q.Run(ctx)    if err != nil {        log.Infof(ctx, "%v", err)    }    status, err := job.Wait(ctx)    if err != nil {        log.Infof(ctx, "%v", err)    }    if err := status.Err(); err != nil {        log.Infof(ctx, "%v", err)    }    it, err := job.Read(ctx)    if err != nil {        log.Infof(ctx, "%v", err)    }    return it}
查看完整描述

2 回答

?
料青山看我应如是

TA贡献1772条经验 获得超8个赞

您可以直接读取表内容而无需发出查询。这不会产生查询费用,并提供与您从查询中获得的相同的行迭代器。

对于小的结果,这很好。对于大表,我建议检查新的存储 api和示例页面上的代码示例。

对于一个小表或只是读取一小部分行,你可以这样做(从一个公共数据集表中读取最多 10k 行):

func TestTableRead(t *testing.T) {

    ctx := context.Background()

    client, err := bigquery.NewClient(ctx, "my-project-id")

    if err != nil {

        t.Fatal(err)

    }


    table := client.DatasetInProject("bigquery-public-data", "stackoverflow").Table("badges")

    it := table.Read(ctx)


    rowLimit := 10000

    var rowsRead int

    for {

        var row []bigquery.Value

        err := it.Next(&row)

        if err == iterator.Done || rowsRead >= rowLimit {

            break

        }


        if err != nil {

            t.Fatalf("error reading row offset %d: %v", rowsRead, err)

        }

        rowsRead++

        fmt.Println(row)

    }

}


查看完整回答
反对 回复 2023-06-19
?
holdtom

TA贡献1805条经验 获得超10个赞

您可以拆分查询以获取 100000 条记录中的 10 条并在多个 goroutine 中运行

使用像sql查询 select * from somewhere order by id DESC limit 100000 offset 0

在下一个协程中select * from somewhere order by id DESC limit 100000 offset 100000


查看完整回答
反对 回复 2023-06-19
  • 2 回答
  • 0 关注
  • 150 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信