首页 > 解决方案 > 如何在 Java 中将 NaN 写入 biqquery?

问题描述

在 biqquery 表中,我们可以使用isNaN()检查NaN值。

但是如何在 Java(JVM 语言)中将 NaN 写入 bigquery 表?

写字符串“NaN”?

欢迎任何意见。谢谢

更新:

我们试图发送Double.NaN,但大查询不接受它并抛出异常。不知道为什么。

Error sending insert request, table: xxxx
com.google.cloud.bigquery.BigQueryException: java.lang.IllegalArgumentException
at com.google.cloud.bigquery.BigQueryException.translateAndThrow(BigQueryException.java:100)
at com.google.cloud.bigquery.BigQueryImpl.insertAll(BigQueryImpl.java:979)
...
Caused by: java.lang.IllegalArgumentException
    at com.google.common.base.Preconditions.checkArgument(Preconditions.java:128)
    at com.google.api.client.util.Preconditions.checkArgument(Preconditions.java:35)    
    at com.google.api.client.json.JsonGenerator.serialize(JsonGenerator.java:134)
    at com.google.api.client.json.JsonGenerator.serialize(JsonGenerator.java:173)
    at com.google.api.client.json.JsonGenerator.serialize(JsonGenerator.java:173)
    at com.google.api.client.json.JsonGenerator.serialize(JsonGenerator.java:173)
    at com.google.api.client.json.JsonGenerator.serialize(JsonGenerator.java:146)
    at com.google.api.client.json.JsonGenerator.serialize(JsonGenerator.java:173)
    at com.google.api.client.json.JsonGenerator.serialize(JsonGenerator.java:105)

标签: javakotlingoogle-bigquerynan

解决方案


Float.NaNDouble.NaN将无法正常工作。

Java BigQuery API 在底层使用Google HTTP Client Library for Java

既不NaN支持也不支持无穷大的 JSON 符号。可能出于这个原因,在序列化提供的数据时,明确禁止它JsonGenerator

double doubleValue = ((Number) value).doubleValue();
Preconditions.checkArgument(!Double.isInfinite(doubleValue) && !Double.isNaN(doubleValue));
writeNumber(doubleValue);

作为旁注,相比之下,该库允许解析此值。请参阅相关的提交

除了前面提到的两种情况,在 Java 中你不能通过其他NaN方式提供值。

在我看来,NaN不应将其作为函数参数传递,而是应将它们视为计算错误或某种溢出的结果,例如可能导致的溢出IEEE_DIVIDE,这就是存在的原因BigQuery 中的数据类型:

如果输入是有限的但输出是非有限的,则函数调用和运算符会返回溢出错误。如果输入包含非有限值,则输出可以是非有限的。一般函数不引入 NaNs 或+/-inf。但是,特定函数(例如)IEEE_DIVIDE可以在有限输入上返回非有限值。所有这些情况都在数学函数中明确指出。

请不要使用NaN,而是将 then 视为null值:这是其他语言所遵循的方法。


推荐阅读