【问题标题】:Google BigQuery REST API C# copy/export table with nested schema as CSV具有嵌套架构的 Google BigQuery REST API C# 复制/导出表为 CSV
【发布时间】:2017-04-21 22:29:51
【问题描述】:

有没有办法使用 REST API 作为 CSV 从 Google BigQuery 导出具有嵌套架构的整个表?

有一个使用非嵌套架构的示例 (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 之类的列...如果我尝试解决它们,我会收到错误消息,即没有这样的列。如果我正在处理“总计”,我会在 csv 的行中获得对象名称“System.Collections.Generic.Dictionary`2[System.String,System.Object]”。

有没有可能做这样的事情?最后,我希望我在 BQ 的 GA 中的表格作为 CSV 在其他地方。

【问题讨论】:

  • 忘记 .NET 或明显的格式错误 - 带有嵌套表的 CSV 会是什么样子?嵌套的标头和数据会去哪里? CSV 是表格数据的简单 格式。你问的肯定不是那个。
  • 您将如何使用这些数据?将其导入另一个数据库?自己处理?把它喂给R?你真的想要那个嵌套结构吗?如果您有大量数据,您可以使用 JSON,尤其是行分隔的 JSON。或者您可以先展平原始数据(最好在 original 查询中,而不是在客户端中)并导出普通的 CSV 文件
  • 数据的目的地是 Azure Blob 存储(之后是 Azure ML)。我想将整个表(它是 BQ 中的 GA 每日生成的表)作为 csv 自动导出到 blob 存储中,以供进一步分析。所以我尝试使用 Google REST API 获取数据,在这个程序中进行转换并使用 Microsoft REST API 存储文件。 CSV 应该/可以看起来像从 BQ 生成的 csv。我的意思是取消嵌套后重复的数据很好。只是想得到一个像我在 BQ 中那样的未嵌套表。
  • 然后在 BQ 中取消嵌套并导出未嵌套的结果。为什么在您的客户端代码中进行这样的转换?在任何情况下,您的代码都不会显示 what 在 totals 行中。您必须执行某种循环来获取每个项目。
  • 错误本身表明totals 是Dictionary&lt;string,object&gt;。只要您知道字段名称,您就可以使用totals["hits"] 等获取单个值。或者您可以使用String.Join(","totals.Values) 在一个步骤中加入所有字典的值。 Dictionary.Values 中的值使用与Dictionary.Keys 相同的顺序。可以使用String.Join(",",tables.Keys)为嵌套表生成表头

标签: c# rest api google-bigquery


【解决方案1】:

这是可能的。在下面的 shema 中选择您需要的每一列并展平所有需要展平的内容。

string query = $@"
#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);

            }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-17
    • 2020-03-22
    • 2017-08-28
    • 2019-02-28
    • 2020-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多