如何在BigQuery中从Datetime列提取年/月/季度并新增列至表中?
解决BigQuery中添加日期拆分列的问题
嘿,我明白你的困扰了!你已经成功用EXTRACT提取出了年、月、季度的值,但直接用SET语句更新时失败,这是因为BigQuery不允许在UPDATE操作中直接创建新列——你得先给表添加这些列再填充数据,或者更简单地直接生成包含新列的新表。下面给你两种可行的方案:
方案一:修改现有表(添加列后更新)
这个方法适合你想保留原表结构,仅新增列的场景:
先添加新列
首先用ALTER TABLE语句给原表添加year、month、quarter这三个列,数据类型选INT64(因为EXTRACT返回的是整数类型):ALTER TABLE `project.dataset.table` ADD COLUMN year INT64, ADD COLUMN month INT64, ADD COLUMN quarter INT64;填充新列数据
列添加完成后,再用UPDATE语句把提取的值填充进去:UPDATE `project.dataset.table` SET year = EXTRACT(YEAR FROM date), month = EXTRACT(MONTH FROM date), quarter = EXTRACT(QUARTER FROM date) WHERE TRUE; -- 这个条件表示更新表中所有行你之前失败的原因就是跳过了第一步——没有先创建这些列,直接
SET当然会报错啦。
方案二:直接创建包含新列的新表(更推荐)
在BigQuery中,创建新表的成本很低(尤其是依托列式存储的特性),而且这种方式不需要分两步操作,还能避免原表被误修改的风险,非常推荐:
CREATE OR REPLACE TABLE `project.dataset.new_table` AS SELECT *, -- 保留原表所有现有列 EXTRACT(YEAR FROM date) AS year, EXTRACT(MONTH FROM date) AS month, EXTRACT(QUARTER FROM date) AS quarter FROM `project.dataset.table`;
如果你的原表是分区表,还可以在CREATE TABLE语句中加上分区设置,保持和原表一致的分区策略。
小提示
- 如果你的表数据量很大,
UPDATE操作会消耗更多的计算资源(槽位),这时用CREATE OR REPLACE TABLE的方式效率更高、成本更低。 - 操作前记得备份原表,避免数据丢失哦!
内容的提问来源于stack exchange,提问作者user2019
相关产品推荐
相关产品推荐

