【问题标题】:How do I restate a partition in C# in BigQuery?如何在 BigQuery 的 C# 中重述分区?
【发布时间】:2016-08-17 14:48:46
【问题描述】:

我在 BigQuery 中有一个名为“rawdata”的未分区表。那张桌子变得很大,我想对它进行分区。我没有找到对原始表进行分区的任何方法,但根据https://cloud.google.com/bigquery/docs/creating-partitioned-tables#restating_data_in_a_partition,我可以运行一个命令行,该命令行将使用查询从未分区的“原始数据”推送到分区表中,但仅限于特定的日期/分区。

我的直觉是使用 C# API(我们已经通过它附加数据)来自动化执行 bq 查询的过程 --replace 从未分区的表中重述,但似乎没有任何东西可以做到这一点在 C# 代码中。你们对如何继续前进有什么建议吗?我应该包装 bq 命令行执行而不是使用 Google API 吗?

【问题讨论】:

    标签: google-bigquery


    【解决方案1】:

    我不确定您指的是 API 的哪一部分,但看起来您在这里指的是查询 API:https://cloud.google.com/bigquery/docs/reference/v2/jobs/query#examples,它不允许您传入目标表并截断/追加给它。

    此处的插入 API:https://cloud.google.com/bigquery/docs/reference/v2/jobs/insert#examples 可用于执行您喜欢的操作,只需在此处填写 Configuration.Query 部分:https://cloud.google.com/bigquery/docs/reference/v2/jobs#configuration.query

    具体来说,您希望将 'configuration.query.destinationTable' 字段指定为要填充的表分区,而 'configuration.query.createDisposition' 和 'configuration.query.writeDisposition' 字段符合您的要求。

    这实际上是 shell 客户端通过 '--replace''--destination_table' 参数所做的事情。

    最后,当您从非分区表创建分区表时,您可能需要检查此线程以考虑成本:Migrating from non-partitioned to Partitioned tables

    【讨论】:

      【解决方案2】:

      基于 Ahmed 的 cmets,我使用 c# api 客户端整理了一些 c# 代码,该客户端可以重述分区的数据。我们的用例是在使用后删除个人信息。下面的代码会将第二个字段设置为空白值。在查询中,我注意到您无法在 CLI 工具中使用的查询中使用 your_table$20180114 语法,因此将其更改为 where 子句以从相应分区检索原始数据。

      var queryRestateJob = _sut.CreateQueryJob(@"SELECT field1, '' as field2, field3  FROM your_dataset.your_table WHERE _PARTITIONTIME = TIMESTAMP('2018-01-14')",
                  new List<BigQueryParameter>(), new QueryOptions
                  {
                      CreateDisposition = CreateDisposition.CreateIfNeeded,
                      WriteDisposition = WriteDisposition.WriteTruncate,
                      DestinationTable = new TableReference
                      {
                          DatasetId = "your_dataset",
                          ProjectId = "your_project",
                          TableId = "your_table$20180114"
                      },
                      AllowLargeResults = true,
                      FlattenResults = false,
                      ProjectId = "your_project"
                  })
                  .PollUntilCompleted();
      
                  queryRestateJob = queryRestateJob.ThrowOnAnyError();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多