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

时间:2018-06-07 23:03:44

标签: go google-bigquery

对于每天明智的分区,我们每隔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

1 个答案:

答案 0 :(得分:1)

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

也就是说,如果作业重试在后端成功进行原始尝试和重试尝试,则可以进行重复。

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