BigQuery上传CSV时TIMESTAMP、INT64解析错误该如何处理?
问题核心根因
你遇到的三类报错本质是两个配置/格式问题导致的:
- 报错2、3的核心原因:上传CSV时未设置跳过表头行,BigQuery把表头的
Id、ActivityHour、StepTotal字段名当成了第一行数据,所以Id字段读出来的值是字符串'Id',无法转为INT64类型 - 报错1的核心原因:BigQuery默认的TIMESTAMP自动检测只支持ISO 8601格式的时间,你给出的是12小时制带AM/PM的美式时间格式,无法被自动识别,还会被误判为携带无效时区
AM
可行解决方案
方案一:上传时直接正确配置(推荐)
无需修改原始CSV文件,调整上传配置即可完成正确导入:
- 第一步:上传CSV到BigQuery的配置流程中,找到高级选项,勾选「跳过表头行」,设置跳过行数为1
- 第二步:手动指定表Schema,三个字段按以下规则设置:
- Id:INT64
- ActivityHour:STRING(先存为字符串,后续用SQL转换为时间类型,避免上传阶段格式校验报错)
- StepTotal:INT64
- 第三步:勾选「允许数值类型前后存在空格」选项,避免原始数据中数字前后带空格导致类型转换失败
- 完成配置后直接上传即可,不会出现类型报错
方案二:已全字段存为STRING的处理方案
如果已经完成全字符串类型的上传,不需要重新导数据,直接用以下SQL完成类型转换即可:
SELECT -- 用SAFE_CAST转换避免异常值报错,转换失败会返回NULL SAFE_CAST(Id AS INT64) AS user_id, -- 按12小时制美式时间格式解析为TIMESTAMP类型 PARSE_TIMESTAMP("%m/%d/%Y %I:%M:%S %p", ActivityHour) AS activity_hour, SAFE_CAST(StepTotal AS INT64) AS step_total FROM `你的数据集名称.你的表名` -- 过滤表头残留行 WHERE Id != 'Id' -- 可选配置:过滤掉格式异常的无效行,不需要可删除 AND SAFE_CAST(Id AS INT64) IS NOT NULL AND PARSE_TIMESTAMP("%m/%d/%Y %I:%M:%S %p", ActivityHour) IS NOT NULL
格式符说明:%m匹配月份、%d匹配日期、%Y匹配四位数年份、%I匹配12小时制小时、%p匹配AM/PM标识,完全适配你给出的4/12/2016 12:00:00 AM格式。
异常值排查
如果执行SQL仍有报错,可执行以下语句定位无效数据行:
SELECT * FROM `你的数据集名称.你的表名` WHERE SAFE_CAST(Id AS INT64) IS NULL AND Id != 'Id'
查询结果就是Id列存在非数字字符的无效行,可根据业务需求手动修正或者直接过滤。
内容的提问来源于stack exchange,提问作者Hyejin Yun
相关产品推荐
相关产品推荐

