You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 05:54:04