猿问

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

我在 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

}


宝慕林4294392
浏览 151回答 2
2回答

料青山看我应如是

您可以直接读取表内容而无需发出查询。这不会产生查询费用,并提供与您从查询中获得的相同的行迭代器。对于小的结果,这很好。对于大表,我建议检查新的存储 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)    }}

holdtom

您可以拆分查询以获取 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
随时随地看视频慕课网APP

相关分类

Go
我要回答