gpt4 book ai didi

go - 需要更快的方法来列出项目中的所有数据集/表

转载 作者:IT王子 更新时间:2023-10-29 01:09:45 26 4
gpt4 key购买 nike

我正在创建一个实用程序,它需要了解我的 BigQuery 项目中存在的所有数据集/表。我当前获取此信息的代码如下(使用 Go API):

func populateExistingTableMap(service *bigquery.Service, cloudCtx context.Context, projectId string) (map[string]map[string]bool, error) {
tableMap := map[string]map[string]bool{}

call := service.Datasets.List(projectId)
//call.Fields("datasets/datasetReference")

if err := call.Pages(cloudCtx, func(page *bigquery.DatasetList) error {
for _, v := range page.Datasets {

if tableMap[v.DatasetReference.DatasetId] == nil {
tableMap[v.DatasetReference.DatasetId] = map[string]bool{}
}

table_call := service.Tables.List(projectId, v.DatasetReference.DatasetId)
//table_call.Fields("tables/tableReference")

if err := table_call.Pages(cloudCtx, func(page *bigquery.TableList) error {
for _, t := range page.Tables {
tableMap[v.DatasetReference.DatasetId][t.TableReference.TableId] = true
}
return nil
}); err != nil {
return errors.New("Error Parsing Table")
}
}
return nil
}); err != nil {
return tableMap, err
}

return tableMap, nil
}

对于一个有大约 5000 个数据集的项目,每个数据集最多有 10 个表,这段代码需要将近 15 分钟才能返回。有没有更快的方法来遍历所有现有数据集/表的名称?我曾尝试使用 Fields 方法仅返回我需要的字段(您可以看到上面注释掉的那些行),但这只会返回我的数据集中的 50 个(恰好 50 个)。

有什么想法吗?

最佳答案

这是我的代码的更新版本,具有并发性,将处理时间从大约 15 分钟减少到 3 分钟。

func populateExistingTableMap(service *bigquery.Service, cloudCtx context.Context, projectId string) (map[string]map[string]bool, error) {
tableMap = map[string]map[string]bool{}

call := service.Datasets.List(projectId)
//call.Fields("datasets/datasetReference")

if err := call.Pages(cloudCtx, func(page *bigquery.DatasetList) error {
var wg sync.WaitGroup
wg.Add(len(page.Datasets))
for _, v := range page.Datasets {
if tableMap[v.DatasetReference.DatasetId] == nil {
tableMap[v.DatasetReference.DatasetId] = map[string]bool{}
}

go func(service *bigquery.Service, datasetID string, projectId string) {
defer wg.Done()
table_call := service.Tables.List(projectId, datasetID)
//table_call.Fields("tables/tableReference")
if err := table_call.Pages(cloudCtx, func(page *bigquery.TableList) error {
for _, t := range page.Tables {
tableMap[datasetID][t.TableReference.TableId] = true
}
return nil // NOTE: returning a non-nil error stops pagination.
}); err != nil {
// TODO: Handle error.
fmt.Println(err)
}
}(service, v.DatasetReference.DatasetId, projectId)
}

wg.Wait()
return nil // NOTE: returning a non-nil error stops pagination.
}); err != nil {
return tableMap, err
// TODO: Handle error.
}

return tableMap, nil
}

关于go - 需要更快的方法来列出项目中的所有数据集/表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38906503/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com