2017-04-07 59 views
0

有沒有一種方法可以使用REST API作爲CSV以Google BigQuery的嵌套模式導出整個表格?Google BigQuery REST API嵌套模式爲CSV的複製/導出表格

有一個這樣做的例子(https://cloud.google.com/bigquery/docs/exporting-data)與一個沒有嵌套架構。這對我的表中沒有嵌套的列正常工作。下面是這部分的代碼:

PagedEnumerable<TableDataList, BigQueryRow> result2 = client.ListRows(datasetId, result.Reference.TableId); 
     StringBuilder sb = new StringBuilder(); 
     foreach (var row in result2) 
     { 
      sb.Append($"{row["visitorId"]}, {row["visitNumber"]}, {row["totals.hits"]}{Environment.NewLine}"); 
     } 

     using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(sb.ToString()))) 
     { 
      var obj = gcsClient.UploadObject(bucketName, fileName, contentType, stream); 
     } 

在BQ還有像totals.hits列,totals.visits ......如果我試圖解決這些問題我得到的errormessage的,有沒有這樣的列。如果我正在處理「總計」,我在我的csv的行中得到對象名「System.Collections.Generic.Dictionary`2 [System.String,System.Object]」。

有沒有可能做這樣的事情?最後,我希望從BQ的GA中獲得我的表格作爲其他地方的CSV。

+0

忘掉.NET或明顯的格式化錯誤 - 嵌套表的CSV如何看起來像?嵌套的頭文件和數據在哪裏去? CSV是表格數據的一種簡單*格式。你問的絕對不是這個。 –

+0

你打算如何使用這些數據?將其導入另一個數據庫?處理它自己?把它餵給R?你真的想要嵌套結構嗎?如果您有大量數據,則可以使用JSON,特別是行分隔的JSON。或者,您可以先將原始數據平坦化(最好在*原始*查詢中,而不是客戶端中)並導出正常的CSV文件 –

+0

數據的目標是Azure Blob Storage(以及之後的Azure ML)。我想要自動導出整個表格(它是從BQ中的GA每天生成的表格)並將其作爲csv存儲到blob存儲器中以供進一步分析。所以我嘗試使用Google REST API獲取數據,在此程序中進行轉換並使用Microsoft REST API存儲文件。 CSV應該可以看起來像BQ生成的csv。我的意思是在重新插入之後的重複數據是好的。只是想獲得一個像BQ一樣無人蔘與的表格。 – Mogry

回答

0

這是可能的。選擇你需要的每一列,在下面的shema和flatten所有的東西都需要被壓平。

string query = [email protected]" 
#legacySQL 
SELECT 
    visitorId, 
    visitNumber, 
    visitId, 
    visitStartTime, 
    date, 
    hits.hitNumber as hitNumber, 
    hits.product.productSKU as product.productSKU 
FROM 
    FLATTEN(FLATTEN({tableName},hits),hits.product)"; 

//Creating a job for the query and activating legacy sql 

      BigQueryJob job = client.CreateQueryJob(query, 
       new CreateQueryJobOptions { UseLegacySql = true }); 

      BigQueryResults queryResult = client.GetQueryResults(job.Reference.JobId, 
       new GetQueryResultsOptions()); 

      StringBuilder sb = new StringBuilder(); 

//Getting the headers from the GA table and write them into the first row of the new table 

      int count = 0; 
      for (int i = 0; i <= queryResult.Schema.Fields.Count() - 1; i++) 
      { 
       string columenname = ""; 
       var header = queryResult.Schema.Fields[0].Name; 
       if (i + 1 >= queryResult.Schema.Fields.Count) 
        columenname = queryResult.Schema.Fields[i].Name; 
       else 
        columenname = queryResult.Schema.Fields[i].Name + ","; 
       sb.Append(columenname); 
      } 

//Getting the data from the GA table and write them row by row into the new table 

      sb.Append(Environment.NewLine); 
      foreach (var row in queryResult.GetRows()) 
      { 

       count++; 
       if (count % 1000 == 0) 
        Console.WriteLine($"item {count} finished"); 
       int blub = queryResult.Schema.Fields.Count; 
       for (Int64 j = 0; j < Convert.ToInt64(blub); j++) 
       { 
        try 
        { 
         if (row.RawRow.F[Convert.ToInt32(j)] != null) 
          sb.Append(row.RawRow.F[Convert.ToInt32(j)].V + ","); 

        } 
        catch (Exception) 
        { 

        } 
       } 
       sb.Append(Environment.NewLine); 

      }