java - 如何在 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)
解决方案
Float.NaN
或Double.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 中的数据类型:
如果输入是有限的但输出是非有限的,则函数调用和运算符会返回溢出错误。如果输入包含非有限值,则输出可以是非有限的。一般函数不引入
NaN
s 或+/-inf
。但是,特定函数(例如)IEEE_DIVIDE
可以在有限输入上返回非有限值。所有这些情况都在数学函数中明确指出。
请不要使用NaN
,而是将 then 视为null
值:这是其他语言所遵循的方法。
推荐阅读
- python - 从类函数返回 true 和一个值
- python - ValueError:尺寸必须相等,但对于输入形状为 [3]、[7,128] 的“添加”(操作:“添加”)为 3 和 128
- java - 从 url 共享音频文件
- c++ - 在 C++ 中调整数组大小时如何修复错误?
- maven - 如何为两个范围设置依赖关系?
- php - 我们的用户从 Amazon S3 随机下载失败,需要帮助找出问题所在
- angular - 如何在 ngFor 中添加角度元素选择器
- excel - VBA UserForm:根据条件复制和粘贴
- hadoop - 为 Kerberos 身份验证配置 Kafka Connect HDFSinkNode
- scala - Spark Scala - date_add() 中的时间戳