导入CSV到BigQuery时如何保留存在缺失列的行?
BigQuery导入缺失末尾列CSV的解决方案
问题根因
你遇到的报错本质是列数校验不通过,和列是否为nullable无关:
Error while reading data, error message: CSV table references column position 40, but line starting at position:X contains only 40 columns
BigQuery解析CSV时会先校验每行的列数是否和表定义的列数一致:你的表定义有41列(列索引从0开始,position 40对应第41列),缺失最后一列的行只有40列,会先被判定为格式错误,不会走到后续的空值校验逻辑,所以哪怕你把最后一列设为nullable也无效。
优先推荐的无预处理解决方案(不需要修改原始CSV)
方案1:开启「允许不齐行」参数(适合暂时不用最后一列、后续可能需要保留该列的场景)
这个参数是BigQuery官方为行末尾缺失列的场景专门设计的,开启后会自动把缺失的末尾列填充为null,完全不需要改动原始4600万行的数据集:
- 控制台上传:在导入配置的「高级选项」中勾选 Allow jagged rows(允许不齐行)
- bq命令行导入:新增参数
--allow_jagged_rows=true - API导入:在Load任务配置中设置
allowJaggedRows = true
方案2:调整表结构+开启「允许多余列」参数(适合确定永久不需要最后一列的场景)
如果你确认后续也不会用到这个布尔类型的最后一列,可以直接调整表定义,只保留前40个需要用到的列,导入时开启允许多余列的参数,BigQuery会自动忽略每行末尾多出来的列,不管行是40列还是41列都可以正常导入:
- 控制台上传:在导入配置的「高级选项」中勾选 Allow extra columns(允许多余列)
- bq命令行导入:新增参数
--allow_extra_columns=true - API导入:在Load任务配置中设置
allowExtraColumns = true
备选预处理方案(仅上述方案不满足需求时使用)
如果因为特殊限制不能使用上述导入参数,可以用命令行工具快速预处理CSV,给缺失最后一列的行补全末尾占位符,示例awk命令(大文件处理效率很高):
awk -F',' 'BEGIN{OFS=","} NF==40{print $0,""} NF==41{print $0}' 原始文件.csv > 预处理后文件.csv
该命令会自动判断每行的列数,40列的行末尾补空值,41列的行原样输出。
内容的提问来源于stack exchange,提问作者Marcelo Soares
相关产品推荐
相关产品推荐

