我有一个值“ 1.8299324324324324324”,如果我使用DML语句插入BigQuery,则将其四舍五入并插入到Bigquery中。
但是,对于相同的值,如果BigQuery在控制台上使用csv文件加载作业,则会出现以下错误。
“位置”:“查询”, “ message”:“无效的NUMERIC值:1.8299324324324324字段:test;值:1.8299324324324324”, “ reason”:“ invalidQuery”
只想检查这是否是Bigquery的局限性,即在加载作业中它无法转换或理解此值以及如何解决该问题?
答案 0 :(得分:2)
我进行了一些测试,可以复制您提到的行为;但是,我找不到任何文档表明这是BigQuery的局限性。假设在这两种情况下都观察到了不同的行为(使用DML语句和加载作业),则该平台似乎有问题,我已在Google's issue tracker中提出了问题。我建议您在那儿跟进此事。
我建议您使用的变通办法是创建一个新表并将该字段定义为float而不是数字,或者将数字内容截断到CSV文件中,然后再将其上载到BigQuery。
答案 1 :(得分:0)
根据documentation, BigQuery's NUMERIC
type的限制为9个十进制数字:
十进制值,其精度为38个十进制数字,比例为9个十进制数字。
作为替代方案,使用(不太精确的)FLOAT64
类型应该绕过此问题。
答案 2 :(得分:0)
我遇到了同样的问题,并在尝试在 Python 中舍入/截断浮点精度时遇到了一些奇怪的行为。 BigQuery 加载作业会增加错误精度,无论四舍五入/截断如何,都会将值推到小数点后 9 位的限制之外。例如,我会使用
将值 53.681482688356219 截断为 53.681482688n = 53.681482688356219
trunc = float(f"{n:.9f}")
但 BigQuery 会将其解释为 53.681482690000003。失败:
<块引用>'无效的数字值:53.681482690000003'
作为一种解决方法,我在插入之前将 Python 浮点值转换为字符串。只要您在 job_config 中手动指定了架构,BigQuery load_table_from_dataframe 函数就会负责将字符串转换为 NUMERIC。
schema = bqclient.schema_from_json('bigquery_schemas/'+path+'.json')
job_config = bigquery.LoadJobConfig(
autodetect=False,
schema=schema,
source_format=bigquery.SourceFormat.CSV,
write_disposition="WRITE_TRUNCATE"
)