对于每天明智的分区,我们每隔3分钟将文件加载到bigquery中,每个文件的大小约为200MB。 (。广州)。有时我得到重复,我不知道为什么。我已经验证输入文件只包含一次数据,并且日志证明文件只处理了一次。重复可能的原因是什么?在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
答案 0 :(得分:1)
BigQuery加载作业是原子的。因此,如果作业返回成功,那么数据将保证只加载一次。
也就是说,如果作业重试在后端成功进行原始尝试和重试尝试,则可以进行重复。
从代码片段中,我不确定是否在客户端实现中发生了重试(如果连接丢失,某些客户端会重试相同的负载。防止重复的常用方法是发送具有相同job_id的BigQuery加载作业如果原始提交仍在运行,BigQuery前端将尝试重复删除重试。