Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Google.Cloud.BigQuery.V2加载BigQuery作业的幂等性_C#_Google Bigquery_Google Cloud Storage - Fatal编程技术网

C# 使用Google.Cloud.BigQuery.V2加载BigQuery作业的幂等性

C# 使用Google.Cloud.BigQuery.V2加载BigQuery作业的幂等性,c#,google-bigquery,google-cloud-storage,C#,Google Bigquery,Google Cloud Storage,您可以使用Google.Cloud.BigQuery.V2中的BigQueryClient创建csv加载作业,以从Google云存储中的csv文件加载数据,该客户端具有CreateLoadJob方法 如何使用此API保证幂等性,以确保在收到响应之前网络已断开,并且您已开始重试,但最终不会将相同的数据多次加载到BigQuery中 API使用示例 private void LoadCsv(string sourceUri, string tableId, string timePartiti

您可以使用Google.Cloud.BigQuery.V2中的BigQueryClient创建csv加载作业,以从Google云存储中的csv文件加载数据,该客户端具有CreateLoadJob方法

如何使用此API保证幂等性,以确保在收到响应之前网络已断开,并且您已开始重试,但最终不会将相同的数据多次加载到BigQuery中

API使用示例

    private void LoadCsv(string sourceUri, string tableId, string timePartitionField)
    {
        var tableReference = new TableReference()
        {
            DatasetId = _dataSetId,
            ProjectId = _projectId,
            TableId = tableId
        };

        var options = new CreateLoadJobOptions
        {
            WriteDisposition = WriteDisposition.WriteAppend,
            CreateDisposition = CreateDisposition.CreateNever,
            SkipLeadingRows = 1,
            SourceFormat = FileFormat.Csv,
            TimePartitioning = new TimePartitioning
            {
                Type = _partitionByDayType,
                Field = timePartitionField
            }
        };

        BigQueryJob loadJob = _bigQueryClient.CreateLoadJob(sourceUri: sourceUri,
                                                            destination: tableReference,
                                                            schema: null,
                                                            options: options);

        loadJob.PollUntilCompletedAsync().Wait();
        if (loadJob.Status.Errors == null || !loadJob.Status.Errors.Any())
        {
            //Log success
            return;
        }
        //Log error
    }

有两个地方最终可能会失去响应:

创建要开始的作业时 当轮询完成时 第一个问题是在没有工作ID的情况下相对难以恢复;您可以列出项目中的所有作业,并尝试找到一个与您创建的作业相似的作业

但是,C客户机库生成作业ID以便重试,或者您可以通过CreateLoadJobOptions指定自己的作业ID


第二次失败时间要简单得多:保留返回的BigQueryJob,以便在失败时重试轮询。例如,您可以存储作业名称,以便即使流程在等待其完成时死亡,也可以进行恢复。

有两个地方可能会导致响应丢失:

创建要开始的作业时 当轮询完成时 第一个问题是在没有工作ID的情况下相对难以恢复;您可以列出项目中的所有作业,并尝试找到一个与您创建的作业相似的作业

但是,C客户机库生成作业ID以便重试,或者您可以通过CreateLoadJobOptions指定自己的作业ID


第二次失败时间要简单得多:保留返回的BigQueryJob,以便在失败时重试轮询。例如,您可以存储作业名称,以便即使进程在等待其完成时死亡,也可以进行恢复。

您可以通过基于加载的文件位置和目标表生成自己的作业ID来实现幂等性

job_id = 'my_load_job_{}'.format(hashlib.md5(sourceUri+_projectId+_datasetId+tableId).hexdigest())
var options = new CreateLoadJobOptions
        {
            WriteDisposition = WriteDisposition.WriteAppend,
            CreateDisposition = CreateDisposition.CreateNever,
            SkipLeadingRows = 1,
            JobId = job_id, #add this
            SourceFormat = FileFormat.Csv,
            TimePartitioning = new TimePartitioning
            {
                Type = _partitionByDayType,
                Field = timePartitionField
            }
        };
在这种情况下,如果尝试重新插入相同的作业id,则会出现错误。
您还可以轻松生成此作业id,以便在池失败时进行检查。

您可以通过基于加载的文件位置和目标表生成自己的作业id来实现幂等性

job_id = 'my_load_job_{}'.format(hashlib.md5(sourceUri+_projectId+_datasetId+tableId).hexdigest())
var options = new CreateLoadJobOptions
        {
            WriteDisposition = WriteDisposition.WriteAppend,
            CreateDisposition = CreateDisposition.CreateNever,
            SkipLeadingRows = 1,
            JobId = job_id, #add this
            SourceFormat = FileFormat.Csv,
            TimePartitioning = new TimePartitioning
            {
                Type = _partitionByDayType,
                Field = timePartitionField
            }
        };
在这种情况下,如果尝试重新插入相同的作业id,则会出现错误。
如果池失败,您也可以轻松生成此作业id以备检查。

当然-我真傻,忘记了我们确实生成了这些作业id…谢谢@AlexeyMaloletkin,我会将此作为一种试探,并报告这对我是如何起作用的。当然,我真傻,因为我们确实生成了那些工作ID……谢谢@AlexeyMaloletkin,我会将此作为试探,并报告这对我是如何起作用的。