【问题标题】:Changing the data type in BigQuery for a partitioned table在 BigQuery 中更改分区表的数据类型
【发布时间】:2018-07-10 23:38:34
【问题描述】:

我在 BigQuery 中有一个分区表来存储用户事件,它具有以下架构,

user_id - String, Required
event_time - DateTime, Required
country - String, Nullable
_PARTITIONTIME - event occurred date

上表包含两年的数据(意味着 730 个分区)。

出于某种原因,我想将数据类型从DateTime 更改为Timestamp。我发现了一个类似的问题herehere,这些对于非分区表来说都很好。但就我而言,我有分区表,所以我需要保留值_PARTITIONTIME

经过一些研究我发现,使用Destination Table 作为table_name$20180126 运行以下查询似乎可以实现我对单个分区的目标,

SELECT user_id, CAST(event_time AS TIMESTAMP) AS event_time, country from [project-id:data_set.table_name] WHERE _PARTITIONTIME >= "2018-01-26 00:00:00" AND _PARTITIONTIME < "2018-01-27 00:00:00"

但问题是,我有一个表的 730 个分区(类似地,我还有 10 个这样的表),在 Web 控制台或通过 API 或通过 BQ 命令行中逐个运行上述查询将需要很长时间。还有其他更好的方法可以以最少的工作量实现用例吗?

【问题讨论】:

  • 虽然 DDL 最近已经推出,但它只支持创建和删除语法。还没有更新。正如您提到的那样编写脚本是要走的路。它不应该花很长时间,因为您可以并行发出多个。
  • @Pentium10 - 如果脚本化,这是否意味着 730 次全表扫描 ($$$)?
  • @GrahamPolley 你有其他建议吗?
  • 我想你可以在这里使用 Dataflow 或 Mikhails 方法(当然稍作调整):stackoverflow.com/questions/38993877/…
  • 你能用一个新列修补你的表吗?运行更新语句以填充新列。最终通过删除旧列来重写表(要么保留它)。 cloud.google.com/bigquery/docs/reference/rest/v2/tables/patch

标签: google-bigquery google-cloud-platform


【解决方案1】:

在 cmets 中有很多讨论,但我想强调两点。

  1. 从今天开始,您可以使用create partitioned tables using an existing column TIMESTAMP 或 DATETIME 类型作为分区定义器。

  2. 还有为Manually Changing Table Schemas发布的指南

您可能希望阅读这两个建议,尤其是第一个对您很方便的建议,并且您会选择重新加载数据以获得很多好处。

【讨论】:

  • 感谢更新,真的很有趣。我希望它会帮助我。但我害怕文档This is a beta release of column-based, time-partitioned tables. This feature might be changed in backward-incompatible ways and is not subject to any SLA or deprecation policy. 中的 beta 警告(因为我想在我的 PROD 环境中做).. 无论如何我会看看它..
  • 不要害怕。 Google 有数十个项目仍处于测试阶段。
猜你喜欢
  • 2021-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多