无法更改 Big Query 中的列数据类型

tom*_*271 7 sqldatatypes google-bigquery

我们将数据库导入 BigQuery,但很多列的数据类型不正确,其中许多列存储为 STRING。我想通过更改 BigQuery 中的数据类型来修复它们

ALTER TABLE my.data_set.my_table ALTER COLUMN create_date SET DATA TYPE DATE;
Run Code Online (Sandbox Code Playgroud)

但我得到了

ALTER TABLE ALTER COLUMN SET DATA TYPE requires that the existing column type (STRING) is assignable to the new type (DATE)
Run Code Online (Sandbox Code Playgroud)

怎么解决呢?

Jos*_*ose 8

请按照以下步骤操作:

  1. 重命名现有列
ALTER TABLE mydataset.mytable
RENAME COLUMN create_date TO create_date_to_drop;
Run Code Online (Sandbox Code Playgroud)
  1. 添加具有所需数据类型的列。
ALTER TABLE mydataset.mytable
ADD COLUMN create_date DATE;
Run Code Online (Sandbox Code Playgroud)
  1. 删除重命名的列。
ALTER TABLE mydataset.mytable
DROP COLUMN create_date_to_drop;
Run Code Online (Sandbox Code Playgroud)

注意:到目前为止,DROP COLUMN 不适用于受客户管理的加密密钥保护的表。

或者,您可以删除 Beta 版本中的现有列并使用新数据类型添加它,但您需要等到时间旅行窗口(默认情况下为 7 天)结束才能添加具有相同名称的列。


Jay*_*ger 6

不幸的是,据我所知,没有办法将数据类型从使用转换为STRING使用DATEALTER TABLE而是使用您想要的模式再次创建它。

CREATE OR REPLACE TABLE testset.tbl AS 
SELECT 'a' AS col1, '2022-05-16' AS create_date
 UNION ALL
SELECT 'a' AS col1, '2022-05-14' AS create_date
;

-- ALTER TABLE testset.tbl ALTER COLUMN create_date SET DATA TYPE DATE;

-- Query error: ALTER TABLE ALTER COLUMN SET DATA TYPE requires that
-- the existing column type (STRING) is assignable to the new type (DATE) at [7:25]


-- Create it again. 
CREATE OR REPLACE TABLE testset.tbl AS
SELECT * REPLACE(SAFE_CAST(create_date AS DATE) AS create_date) 
  FROM testset.tbl;
Run Code Online (Sandbox Code Playgroud)