【发布时间】: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。我发现了一个类似的问题here 和here,这些对于非分区表来说都很好。但就我而言,我有分区表,所以我需要保留值_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