BigQuery - извлекает 1000000 записей и выполняет обработку данных с помощью goLang. - PullRequest
0 голосов
/ 22 мая 2019

У меня есть 1000000 записей внутри BigQuery.Каков наилучший способ извлечения данных из БД и обработки с помощью goLang?У меня проблема с тайм-аутом при получении всех данных без ограничений.Я уже увеличиваю лимит до 5 минут, но это занимает более 5 минут.Я хочу реализовать потоковый вызов или нумерацию страниц, но я не знаю, как это сделать.

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 ]

2 голосов
/ 22 мая 2019

Вы можете читать содержимое таблицы напрямую, не отправляя запрос.Это не требует затрат на запрос и обеспечивает тот же итератор строк, что и запрос.

Для небольших результатов это нормально.Для больших таблиц я бы предложил проверить новый api хранилища и пример кода на странице samples .

Для маленькой таблицы или просто для чтения маленькойподмножество строк, вы можете сделать что-то вроде этого (читает до 10 000 строк из одной из общедоступных таблиц набора данных):

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)
    }
}
1 голос
/ 22 мая 2019

вы можете разделить ваш запрос, чтобы получить 10x из 100000 записей и выполнить в нескольких задачах

использовать SQL-запрос, например select * from somewhere order by id DESC limit 100000 offset 0

и в следующей процедуре select * from somewhere order by id DESC limit 100000 offset 100000

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...