2017-04-07 34 views
0

REST APIをCSVとして使用して、Google BigQueryのネストされたスキーマを使用してテーブル全体をエクスポートする方法はありますか?Google BigQuery REST API CSVとしてネストされたスキーマを持つC#コピー/エクスポートテーブル

ネストされていないスキーマでこれを実行する例があります(https://cloud.google.com/bigquery/docs/exporting-data)。これは、テーブル内のネストされていない列で正常に動作します。ここでは、この部分のコードは次のとおりです。BQで

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); 
     } 

totals.hitsのような列がある、totals.visits ...私はそれらに対処しようとした場合、私はそのような列がないことにErrorMessageを得ました。私が "合計"を扱っている場合、私は自分のcsvの行にobjectname "System.Collections.Generic.Dictionary`2 [System.String、System.Object]"を取得します。

何か可能性はありますか?最終的に私はBQのGAのテーブルをCSVとしてどこか別の場所に置いておきたい。

+0

.NETや明示的な書式設定のバグは忘れてしまいます。ネストした表のCSVはどのように見えますか?ネストされたヘッダーとデータはどこに行きますか? CSVは、表形式データのための*シンプル*形式です。あなたが尋ねるものは、間違いなくそれです。 –

+0

どのようにそのデータを使用しますか?それを別のデータベースにインポートしますか?自分で処理しますか?それをRに送りますか?あなたは本当にその入れ子構造を望んでいますか? JSONを使用することができます。特にデータが多い場合は、行区切りのJSONを使用できます。または、元のデータを最初に平坦化して(クライアントではなくオリジナルの*クエリで)、通常のCSVファイルをエクスポートすることができます。 –

+0

データの宛先はAzure BLOBストレージ(およびそのAzure ML)です。私はテーブル全体(BQのGAから毎日生成されたテーブル)を自動的にエクスポートして、さらなる分析のためにcsvとしてブロブストレージに格納したいと思っています。そこで、Google REST APIを使用してデータを取得し、このプログラムで変換を行い、Microsoft REST APIを使用してファイルを保存しようとします。 CSVはBQから生成されたcsvのように見えます。私は、ネストされていないデータが繰り返されていることを意味します。私がBQに入ることができるように、不必要なテーブルを取得したいだけです。 – Mogry

答えて

0

可能です。次のような必要なすべての列を選択して、すべてを平坦化する必要があります。

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); 

      } 
関連する問題