BigQuery加载作业无法识别长精度NUMERIC值?求问原因及解决办法
BigQuery加载作业与DML的NUMERIC处理差异及解决方法
这确实是BigQuery设计上的功能差异,而非bug——加载作业和DML语句对超出NUMERIC精度范围的值处理逻辑完全不同:
- 当你用DML插入
"1.8299324324324324"这类长十进制值时,BigQuery会自动将其舍入到NUMERIC类型支持的精度(最多38位总位数,小数部分最多9位),以此保证插入操作顺利完成; - 但CSV加载作业默认采用严格模式,它不会自动修改原始数据,一旦发现值的精度超出目标NUMERIC列的限制,就会直接抛出你看到的
Invalid NUMERIC value错误,目的是避免意外篡改数据。
解决方法
你可以通过以下几种方式解决这个问题:
调整加载作业的舍入配置(推荐)
在控制台加载CSV时,完成基础设置后点击「高级选项」,找到「数值处理」区域,勾选「允许将超出精度/小数位数的值舍入到目标列的限制」,并选择合适的舍入模式(比如四舍五入),再提交加载作业即可。
如果用CLI命令加载,只需添加--rounding_mode=ROUND_HALF_UP参数,示例:bq load --source_format=CSV --rounding_mode=ROUND_HALF_UP my_dataset.my_table gs://my_bucket/test.csv test:NUMERIC预处理CSV文件
在加载前手动将CSV中的长十进制值舍入到9位小数(NUMERIC支持的最大小数位数),比如把"1.8299324324324324"修改为"1.829932432",再进行加载操作。临时用FLOAT64中转
先创建一个带FLOAT64类型列的临时表,将CSV数据加载到这个临时表中,再通过DML语句将FLOAT64值转换为NUMERIC并插入目标表(此时会自动舍入),示例SQL:INSERT INTO my_dataset.target_table (test) SELECT CAST(test AS NUMERIC) FROM my_dataset.temp_float_table;完成后可以删除临时表。
内容的提问来源于stack exchange,提问作者Pankaj Bajpai
相关产品推荐
相关产品推荐

