CSV导入Google BigQuery时字符串列自动转为日期格式的问题排查
CSV导入BigQuery时字符串列被误识别为日期的解决方案
一、先搞定Excel导出的坑
Excel自动格式化是重灾区,你加空格没用——保存CSV时Excel会自动过滤无关格式,甚至悄悄把数字串转成日期字符串。按这个步骤来:
- 选中出问题的列,右键设置单元格格式为文本,重新输入或粘贴内容(确保内容是纯文本,不是隐藏的日期格式)。
- 另存为CSV时,选「CSV (逗号分隔)(*.csv)」,弹出兼容性提示直接确认,别选其他变种格式。
- 存完用记事本打开CSV,检查目标列内容是不是你要的原始数字/字符串,不是
202X-XX-XX这类日期格式。
二、BigQuery导入时强制锁死Schema
别依赖BigQuery的自动检测,手动指定Schema才能确保类型不被篡改:
- 网页端导入:到「Schema」步骤,选「手动输入 schema」,把出问题的列类型明确设为
STRING,其他列按需求配置。 - 命令行导入:用
bq load时加--schema参数强制指定,比如:
这里把bq load --source_format=CSV --skip_leading_rows=1 your_dataset.your_table your_file.csv "col1:STRING,col2:INTEGER,col3:FLOAT,problem_col:STRING"problem_col明确设为STRING,完全跳过自动推断。
三、已经导入错误数据?这么修复
如果数据已经进了BigQuery,分两种情况修正:
- 内容是类似
MM/DD被转成了标准日期:
(如果是UPDATE your_dataset.your_table SET problem_col = FORMAT_DATE("%m/%d", CAST(problem_col AS DATE)) WHERE REGEXP_CONTAINS(problem_col, r'^\d{4}-\d{2}-\d{2}$')DD/MM格式,把%m/%d换成%d/%m) - 内容是Excel日期序列号(比如数字45231被转成2023-05-20):
(Excel序列号从1900-01-01算天数,BigQuery从1970-01-01算,加719528补偏移)UPDATE your_dataset.your_table SET problem_col = CAST(EXTRACT(DAYOFYEAR FROM CAST(problem_col AS DATE)) + 719528 AS STRING)
为啥只有这一列出问题?
因为这列的内容格式刚好踩中了BigQuery的日期推断规则——比如有/、-分隔的数字,或者数值落在Excel日期序列号范围内,其他列的内容格式不符合,所以没被误识别。
内容的提问来源于stack exchange,提问作者István Sándor
相关产品推荐
相关产品推荐

