Google BigQuery:将 ExecuteQuery 结果以 json 格式上传到 Google Cloud Storage

Posted

技术标签:

【中文标题】Google BigQuery:将 ExecuteQuery 结果以 json 格式上传到 Google Cloud Storage【英文标题】:Google BigQuery: Upload ExecuteQuery result to Google Cloud Storage in json format 【发布时间】:2018-08-14 12:51:10 【问题描述】:

我正在导入包含重复记录的 bigquery 表,我需要将这些记录上传到谷歌云存储,如何将结果转换为 json 格式以便将其存储在谷歌云中?

下面是我的代码:

  BigQueryClient Client = BigQueryClient.Create("test", _googleCredential)

   string query = @"select * from `projecttest.TestDataset.CostData`";

 result = Client.ExecuteQuery(query, parameters: null, queryOptions: new QueryOptions  UseLegacySql = false );

【问题讨论】:

【参考方案1】:

我看到你对整个表执行此操作 - 你应该使用 JSON 格式的导出作业

【讨论】:

感谢您的回复,能否请您提供使用 c# 导出作业的文档。你指的是github.com/GoogleCloudPlatform/dotnet-docs-samples/blob/…中的方法ExportJsonToGcs@ 我必须导入其中有重复记录的通配符表。因此,很难通过匹配每一行/列来创建 json。我们有什么方法可以跳过手动创建 json 吗? 当然。你可以试试这个方法(我不再是 c# 人,所以不能肯定地说 - 相关的 api 是 here 并且你在导出时不需要设置模式 - 请参阅 here 以设置所需的属性。也 - 重要- SELECT * 产生扫描整个表的成本与导出是免费的【参考方案2】:

您可以使用 Exporting Table Data BigQuery 功能以多种格式将您的表数据从 BigQuery 导出到 GCS,例如 JSON, CSV and Avro 导出格式.

我建议您查看 Exporting data stored in BigQuery 官方文档,其中包含一些有用的示例,以通过 API、Web UI、命令行和客户端库提交提取作业,以防您使用一种特定的编程语言,如以下 C# 代码示例所示:

public void ExportJsonToGcs(
    string datasetId, string tableId, string bucketName, string fileName,
    BigQueryClient client)

    StorageClient gcsClient = StorageClient.Create();
    string contentType = "application/json";
    // Get Table and append results into StringBuilder.
    PagedEnumerable<TableDataList, BigQueryRow> result = client.ListRows(datasetId, tableId);
    StringBuilder sb = new StringBuilder();
    foreach (var row in result)
    
        sb.Append($"\"title\" : \"row["title"]\", \"unique_words\":\"row["unique_words"]\"Environment.NewLine");
    
    // Save stream to Google Cloud Storage.
    using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(sb.ToString())))
    
        var obj = gcsClient.UploadObject(bucketName, fileName, contentType, stream);
    

【讨论】:

我看到了这段代码,但我必须上传其中包含记录数据类型的表。导入这些表是否可行? 根据Specifying nested and repeated columns 文档,您可以上传具有RECORD 数据类型的表,因为BigQuery 支持来自支持基于对象架构的源格式(例如JSON 文件)的嵌套和重复数据. 如果我需要上传 n 个表,那么手动为每个表指定架构不是一个好习惯。 我同意。提到嵌套和重复列引用以指出对RECORD 和STRUCT 数据类型的支持。基于此,您应该能够在处理这些记录时毫无问题地使用 导出表数据 BigQuery 功能。 但是,由于您无法在单个导出作业中从多个表中导出数据,我认为您可以获取一个 BigQuery 表列表并使用它将您的表一个一个地移入/移出 GCS,添加将它们加载到 BigQuery 时自动检测架构以自动检测字段数据类型。

以上是关于Google BigQuery:将 ExecuteQuery 结果以 json 格式上传到 Google Cloud Storage的主要内容,如果未能解决你的问题,请参考以下文章

将数据从 Google 永久磁盘加载到 BigQuery?

从 Google 脚本将数据插入 BigQuery:遇到“”

将 Firebase Google Analytic 数据导入 BigQuery 时,Google 是不是会收取流媒体费用?

我们可以将 BigQuery 中的数据导入 Google 表格吗?

如何将 Google Analytics 数据导出到 Google GCS 存储桶或 BigQuery?

使用 spark 将 parquet 数据从 Google 云存储加载到 BigQuery