BigQuery插入报错:STRING类型无法插入INT64列求助
解决BigQuery插入时字段类型不匹配问题
你的问题核心在于转换查询仅生成临时结果,未实际修改原表的字段类型,而且你写的WITH子句语法本身就有错误——那个查询只是临时查出转换后的数据,并没有把Dataset.Dec2020里的start_station_id字段真正改成INT64类型,所以后续插入时依然读取原表的STRING类型字段,自然触发类型不匹配错误。
给你两种可行的解决办法:
方法1:插入时直接转换字段(推荐,无需修改原表)
不用单独执行转换操作,直接在INSERT语句中指定字段并完成类型转换,避免使用SELECT *(*会包含原表所有未转换的字段):
INSERT INTO `Dataset.Main` SELECT -- 列出所有字段,对start_station_id做类型转换,其余字段直接保留 column1, column2, column3, column4, column5, CAST(start_station_id AS INT64) AS start_station_id, -- 继续列出后续其他字段 column7, ... FROM `Dataset.Dec2020`
如果不想手动逐个列出字段,可以用排除语法简化:
INSERT INTO `Dataset.Main` SELECT EXCEPT(start_station_id), CAST(start_station_id AS INT64) AS start_station_id FROM `Dataset.Dec2020`
方法2:修改原表的字段类型
如果后续会频繁使用该表,直接修改原表字段类型更一劳永逸。BigQuery修改字段类型需通过重建表实现:
-- 重建表并将start_station_id改为INT64类型 CREATE OR REPLACE TABLE `Dataset.Dec2020` AS SELECT EXCEPT(start_station_id), CAST(start_station_id AS INT64) AS start_station_id FROM `Dataset.Dec2020`
执行完该语句后,原表的start_station_id字段类型已更新为INT64,再执行你原来的INSERT语句就不会报错了。
另外纠正你之前转换查询的语法错误(即使修复后也仅能生成临时结果,无法修改原表):
WITH temp_table AS ( SELECT CAST(start_station_id AS INT64) AS start_station_id, * EXCEPT(start_station_id) FROM `Dataset.Dec2020` ) SELECT * FROM temp_table
内容的提问来源于stack exchange,提问作者Muange
相关产品推荐
相关产品推荐

