现在,从UI运行加载作业时,大查询会自动将长十进制值自动转换为数字

时间:2019-04-29 13:29:40

标签: google-bigquery

我有一个值“ 1.8299324324324324324”,如果我使用DML语句插入BigQuery,则将其四舍五入并插入到Bigquery中。

但是,对于相同的值,如果BigQuery在控制台上使用csv文件加载作业,则会出现以下错误。

  

“位置”:“查询”,         “ message”:“无效的NUMERIC值:1.8299324324324324字段:test;值:1.8299324324324324”,         “ reason”:“ invalidQuery”

只想检查这是否是Bigquery的局限性,即在加载作业中它无法转换或理解此值以及如何解决该问题?

3 个答案:

答案 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.681482688
n = 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"
)