首頁  >  文章  >  後端開發  >  在 Go SDK 中等待 AWS Athena 查詢執行

在 Go SDK 中等待 AWS Athena 查詢執行

王林
王林轉載
2024-02-09 15:09:181037瀏覽

在 Go SDK 中等待 AWS Athena 查询执行

php小編百草在Go SDK中等待AWS Athena查詢執行指南中,旨在幫助開發者最佳化查詢效能和提高應用程式的回應速度。 AWS Athena是一種無伺服器查詢服務,可直接在S3儲存桶中執行SQL查詢,無需預先定義模式或進行資料載入。然而,由於查詢的非同步執行特性,開發者需要等待查詢完成後才能取得結果。本指南將介紹如何使用Go SDK中的等待機制,以便在查詢執行期間進行有效的等待,並在查詢完成後取得結果,從而提供更好的使用者體驗和應用程式效能。

問題內容

我有一個執行athena 查詢的工作程式碼,並透過使用以下程式碼輪詢getqueryresults 傳回的error 來等待查詢完成:

func getqueryresults(client *athena.client, queryid *string) []types.row {

    params := &athena.getqueryresultsinput{
        queryexecutionid: queryid,
    }

    data, err := client.getqueryresults(context.todo(), params)

    for err != nil {
        println(err.error())
        time.sleep(time.second)
        data, err = client.getqueryresults(context.todo(), params)
    }

    return data.resultset.rows
}

問題是,如果查詢失敗,我絕對沒有辦法打破循環。

例如,在 python 中我可以執行以下操作:

    while athena.get_query_execution(QueryExecutionId=execution_id)["QueryExecution"][
        "Status"
    ]["State"] in ["RUNNING", "QUEUED"]:
        sleep(2)

我可以在for 迴圈內進行類似strings.contains(err.error(),"failed") 的檢查,但我正在尋找一種更乾淨的方法。

我嘗試尋找 go 的等效項,但沒有成功。 go sdk有沒有可以回傳執行狀態的函式?有沒有更好的方法來進一步檢查 go 中的錯誤而不是 err != nil

解決方法

sdk已提供重試功能。

這是一個使用 aws-sdk-go-v2 的範例。

package main

import (
    "context"
    "fmt"
    "time"

    "github.com/aws/aws-sdk-go-v2/aws"
    "github.com/aws/aws-sdk-go-v2/service/athena"
    "github.com/aws/aws-sdk-go-v2/service/athena/types"
)

func main() {
    cfg := aws.NewConfig()
    ath := athena.NewFromConfig(*cfg)

    ctx, cancelFunc := context.WithTimeout(context.Background(), time.Minute*5)
    defer cancelFunc()

    rows, err := GetQueryResults(ctx, ath, aws.String("query-id"), 10)
    if err != nil {
        panic(err) // TODO: handle error
    }

    fmt.Println(rows)
}

func GetQueryResults(ctx context.Context, client *athena.Client, QueryID *string, attempts int) ([]types.Row, error) {
    t := time.NewTicker(time.Second * 5)
    defer t.Stop()

    attemptsFunc := func(o *athena.Options) { o.RetryMaxAttempts = attempts }

WAIT:
    for {
        select {
        case <-t.C:
            out, err := client.GetQueryExecution(ctx, &athena.GetQueryExecutionInput{
                QueryExecutionId: QueryID,
            }, attemptsFunc)
            if err != nil {
                return nil, err
            }

            switch out.QueryExecution.Status.State {
            case types.QueryExecutionStateCancelled,
                types.QueryExecutionStateFailed,
                types.QueryExecutionStateSucceeded:
                break WAIT
            }

        case <-ctx.Done():
            break WAIT
        }
    }

    data, err := client.GetQueryResults(ctx, &athena.GetQueryResultsInput{
        QueryExecutionId: QueryID,
    })
    if err != nil {
        return nil, err
    }

    return data.ResultSet.Rows, nil
}

以上是在 Go SDK 中等待 AWS Athena 查詢執行的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除