go - 从谷歌存储加载文件时,在 bigquery 中使用 .Run(ctx) 重复记录

标签 go google-bigquery

对于每天明智的分区,我们每 3 分钟将文件加载到 bigquery 中,每个文件的大小约为 200MB。 (.gz)。有时我会重复,但我不确定为什么。我已经验证输入文件只包含一次数据并且日志证明文件只被处理过一次。重复的可能原因是什么?在 bigquery 上传之前有什么方法可以阻止它吗?

client, err := bigquery.NewClient(ctx, loadJob.ProjectID, clientOption)
if err != nil {
    return nil, jobID, err
}
defer client.Close()
ref := bigquery.NewGCSReference(loadJob.URIs...)
if loadJob.Schema == nil {
    ref.AutoDetect = true
} else {
    ref.Schema = loadJob.Schema
}
ref.SourceFormat = bigquery.JSON
dataset := client.DatasetInProject(loadJob.ProjectID, loadJob.DatasetID)
if err := dataset.Create(ctx, nil); err != nil {
    // Create dataset if it does exist, otherwise ignore duplicate error
    if !strings.Contains(err.Error(), ErrorDuplicate) {
        return nil, jobID, err
    }
}
loader := dataset.Table(loadJob.TableID).LoaderFrom(ref)
loader.CreateDisposition = bigquery.CreateIfNeeded
loader.WriteDisposition = bigquery.WriteAppend
loader.JobID = jobID
job, err := loader.Run(ctx)
if err != nil {
    return nil, jobID, err
}
status, err := job.Wait(ctx)
return status, jobID, err

最佳答案

BigQuery 加载作业是原子的。因此,如果作业成功返回,则数据将保证只加载一次。

也就是说,如果作业重试在后端对原始尝试和重试尝试都成功,则可能会出现重复。

从代码片段中,我不确定客户端实现中是否发生重试(如果连接断开,一些客户端会重试相同的负载。防止重复的常用方法是发送具有相同 job_id 的 BigQuery 加载作业数据。如果原始提交仍在运行,BigQuery 前端将尝试对重试进行重复数据删除。

关于go - 从谷歌存储加载文件时,在 bigquery 中使用 .Run(ctx) 重复记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50751270/

相关文章:

sql - 在 BQ 中通过 STRUCT 聚合

sql - BigQuery : Converting key-value pairs in Array to columns

google-bigquery - bigquery加入重复嵌套

go - 尝试使用 close(ch) 结束 goroutine 但最终会无限运行

Golang变量声明语法含义

powershell - 如何在 Go 中使用 VirtualQueryEx 读取检索进程内存信息?

javascript - OAuth 2.0 使用 Google Client for JavaScript,权限被拒绝

go - 使用 io.Pipes() 发送和接收消息

google-app-engine - 如何管理我的谷歌应用引擎(使用 golang)的帐户?

google-bigquery - 选择 BigQuery 中没有记录的记录