对象引用未设置为 Google Cloud Loadobject 中的对象实例

Posted

技术标签:

【中文标题】对象引用未设置为 Google Cloud Loadobject 中的对象实例【英文标题】:Object Reference Not Set to Instance of an Object in Google Cloud Loadobject 【发布时间】:2015-07-15 01:52:09 【问题描述】:
`loadconfig.SourceUris.Add(@"gs:\\planar-fulcrum-837\leadload-ip\01-         
 02-2013");`

设置为对象实例的空对象引用

【问题讨论】:

我不确定这里问的是什么...... 我正在尝试将 .csv 文件从谷歌云加载到大查询表中。所以我使用 .net 云和大型查询库将云 .csv 文件加载到 bq。或者,如果有人可以建议如何将 MULTIPLE .CSV 文件从云插入到大查询...使用大查询 LOAD 命令行实用程序 为什么不首先问这个?另外,为什么是晦涩的标题? 【参考方案1】:

以下是将 CSV 文件从云存储加载到 Google Big Query 的工作示例。

更新“ServiceAccountEmail、KeyFileName、KeySecret、ProjectID、Dataset name等变量”。

将您的表架构添加到此变量中

TableSchema Schema = new TableSchema();

这里我使用的是单个文件加载,你可以在这个变量中添加 N 个 CSV 文件

System.Collections.Generic.IList<string> URIs = newSystem.Collections.Generic.List<string>();
URIs.Add(filePath);

使用下面的代码修改和使用它。祝你有美好的一天。 (我发现这个解决方案工作了 3 天以上)。

using Google.Apis.Auth.OAuth2;
using System.IO;
using System.Threading;
using Google.Apis.Bigquery.v2;
using Google.Apis.Bigquery.v2.Data;
using System.Data;
using Google.Apis.Services;
using System;
using System.Security.Cryptography.X509Certificates;

namespace GoogleBigQuery

    public class Class1
    
        private static void Main()
        
            try
            
                String serviceAccountEmail = "SERVICE ACCOUNT EMAIL";

                var certificate = new X509Certificate2(@"KEY FILE NAME & PATH", "KEY SECRET", X509KeyStorageFlags.Exportable);

                // SYNTAX: var certificate=new X509Certificate2(KEY FILE PATH+NAME (Here it resides in Bin\Debug folder so only name is enough), SECRET KEY, X509KeyStorageFlags.Exportable);

                ServiceAccountCredential credential = new ServiceAccountCredential(
                   new ServiceAccountCredential.Initializer(serviceAccountEmail)
                   
                       Scopes = new[]  BigqueryService.Scope.Bigquery, BigqueryService.Scope.BigqueryInsertdata, BigqueryService.Scope.CloudPlatform, BigqueryService.Scope.DevstorageFullControl 
                   .FromCertificate(certificate));

                //  Create and initialize the Bigquery service. Use the Project Name value
                //  from the New Project window for the ApplicationName variable.

                BigqueryService Service = new BigqueryService(new BaseClientService.Initializer()
                
                    HttpClientInitializer = credential,
                    ApplicationName = "APPLICATION NAME"
                );

                TableSchema Schema = new TableSchema();

                TableFieldSchema F1 = new TableFieldSchema();
                F1.Name = "COLUMN NAME";
                F1.Type = "STRING";
                F1.Mode = "REQUIRED";

                TableFieldSchema F2 = new TableFieldSchema();
                F1.Name = "COLUMN NAME";
                F1.Type = "INTEGER";
                F1.Mode = "NULLABLE";

                //Add N number of fields as per your needs

                System.Collections.Generic.IList<TableFieldSchema> FS = new System.Collections.Generic.List<TableFieldSchema>();
                FS.Add(F1);
                FS.Add(F2);

                Schema.Fields = FS;

                JobReference JR = JobUpload("PROJECT ID", "DATASET NAME", "TABLE NAME", @"gs://BUCKET NAME/FILENAME", Schema, "CREATE_IF_NEEDED", "WRITE_APPEND", '|', Service);

                //SYNTAX JobReference JR = JobUpload(PROJECT ID, DATASET NAME, TABLE NAME, FULL PATH OF CSV FILE,FILENAME IN CLOUD STORAGE, TABLE SCHEMA, CREATE DISPOSITION, DELIMITER, BIGQUERY SERVICE);

                while (true)
                
                    var PollJob = Service.Jobs.Get(JR.ProjectId, JR.JobId).Execute();

                    Console.WriteLine("Job status" + JR.JobId + ": " + PollJob.Status.State);
                    if (PollJob.Status.State.Equals("DONE"))
                    
                        Console.WriteLine("JOB Completed");
                        Console.ReadLine();
                        return;
                    
                
            
            catch (Exception e)
            
                Console.WriteLine("Error Occurred: " + e.Message);
            

            Console.ReadLine();
        

        public static JobReference JobUpload(string project, string dataset, string tableId, string filePath, TableSchema schema, string createDisposition, string writeDisposition, char delimiter, BigqueryService BigQueryService)
        

            TableReference DestTable = new TableReference();
            DestTable.ProjectId = project;
            DestTable.DatasetId = dataset;
            DestTable.TableId = tableId;

            Job Job = new Job();
            JobConfiguration Config = new JobConfiguration();
            JobConfigurationLoad ConfigLoad = new JobConfigurationLoad();

            ConfigLoad.Schema = schema;
            ConfigLoad.DestinationTable = DestTable;
            ConfigLoad.Encoding = "ISO-8859-1";
            ConfigLoad.CreateDisposition = createDisposition;
            ConfigLoad.WriteDisposition = writeDisposition;
            ConfigLoad.FieldDelimiter = delimiter.ToString();
            ConfigLoad.AllowJaggedRows = true;
            ConfigLoad.SourceFormat = "CSV";
            ConfigLoad.SkipLeadingRows = 1;
            ConfigLoad.MaxBadRecords = 100000;

            System.Collections.Generic.IList<string> URIs = new System.Collections.Generic.List<string>();
            URIs.Add(filePath);

            //You can add N number of CSV Files here

            ConfigLoad.SourceUris = URIs;
            Config.Load = ConfigLoad;
            Job.Configuration = Config;

            //set job reference (mainly job id)
            JobReference JobRef = new JobReference();
            Random r = new Random();
            var JobNo = r.Next();
            JobRef.JobId = "Job" + JobNo.ToString();
            JobRef.ProjectId = project;
            Job.JobReference = JobRef;

            JobsResource.InsertRequest InsertMediaUpload = new JobsResource.InsertRequest(BigQueryService, Job, Job.JobReference.ProjectId);
            var JobInfo = InsertMediaUpload.Execute();

            return JobRef;
        
    

【讨论】:

以上是关于对象引用未设置为 Google Cloud Loadobject 中的对象实例的主要内容,如果未能解决你的问题,请参考以下文章

Google Cloud Platform 发布/订阅 - 消息未传递给订阅者

Google Cloud Builder-构建触发器失败,并显示“未找到请求的资源”

使用 Google Cloud 文字转语音 API

Discord.NET '对象引用未设置为对象的实例。 C# [重复]

对象引用未设置为对象的实例...错误?

Ldap连接抛出对象引用未设置为对象错误的实例