go - 无需等待流缓冲区刷新即可将数据上传到表

标签 go google-bigquery

我有一个 Go 程序,它从表 (T1) 下载数据,对其进行格式化,然后将其上传到新的临时表 (T2)。数据上传后(30 秒左右),应将数据复制到第三个表 (T3)。

格式化数据上传到T2后,查询表返回结果ok。但是,在复制表时 - 作业几乎立即完成并且目标表 (T3) 为空。

我正在按照建议复制表格 here - 但在 UI 中执行操作时结果相同。

在表元数据部分,它显示为 0B,0 行,但其中大约有 10 万行和 18mb 的数据 - 或者至少这是从查询返回的数据。

编辑 我没有发现这些数据仍然停留在流缓冲区中 - 请参阅我的回答。

最佳答案

对我的问题的评论让我看到问题出在流缓冲区。这需要很长时间才能冲洗 - 无法手动冲洗。

我最终阅读了这个问题并在 GitHub 上发表评论 here .这建议改用加载作业。

经过一些研究,我意识到可以通过配置加载程序的 ReaderSourceio.Reader 以及 Google Cloud Storage Reference 中读取数据。

我使用流缓冲区的原始实现如下所示:

var vss []*bigquery.ValuesSaver
// for each row:
vss = append(vss, &bigquery.ValuesSaver{
    Schema:   schema,
    InsertID: fmt.Sprintf(index of loop),
    Row: []bigquery.Value{
        "data"
    },
})

err := uploader.Put(ctx, vss)
if err != nil {
    if pmErr, ok := err.(bigquery.PutMultiError); ok {
        for _, rowInsertionError := range pmErr {
            log.Println(rowInsertionError.Errors)
        }
    }

    return fmt.Errorf("failed to insert data: %v", err)
}

我能够使用如下代码将其更改为加载作业:

var lines []string
for _, v := range rows {
    json, err := json.Marshal(v)
    if err != nil {
        return fmt.Errorf("failed generate json %v, %+v", err, v)
    }
    lines = append(lines, string(json))
}

dataString := strings.Join(lines, "\n")

rs := bigquery.NewReaderSource(strings.NewReader(dataString))
rs.FileConfig.SourceFormat = bigquery.JSON
rs.FileConfig.Schema = schema
loader := dataset.Table(t2Name).LoaderFrom(rs)
loader.CreateDisposition = bigquery.CreateIfNeeded
loader.WriteDisposition = bigquery.WriteTruncate
job, err := loader.Run(ctx)
if err != nil {
    return fmt.Errorf("failed to start load job %v", err)
}
_, err := job.Wait(ctx)
if err != nil {
    return fmt.Errorf("load job failed %v", err)
}

现在表中的数据“立即”可用 - 我不再需要等待流缓冲区。

关于go - 无需等待流缓冲区刷新即可将数据上传到表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54163963/

相关文章:

google-bigquery - BigQuery是否支持UPDATE,DELETE和INSERT(SQL DML)语句?

gccgo 4.9.2 动态链接器错误 : undefined reference to `sync..import'

javascript - 参数化 Bigquery 和字符串值数组

python - 从静态 bigquery 元数据表获取元数据时出现问题

json - 如何在golang中将字符串转换为json?

google-bigquery - 大查询 : Selecting the smallest difference among fields in a repeated record

python - BigQuery 无效的数据集 ID

mongodb - 如何求和字段的值?

hash - 调用 Write(val) 然后调用 Sum(nil) 与哈希中的 Sum(val) 之间的区别?

go - 为什么使用golang的mgo库找不到id?