BigQuery在Json内部支持NaN吗



考虑BigQuery Schema"时间=时间戳,数据=字符串";以及下面的两行

2012-11-01 03:45:23 UTC, { "Sensor1": [45.56], "Sensor2": [45.56], "Sensor3": [34.45]}
2012-11-01 05:45:23 UTC, { "Sensor1": [11.43], "Sensor2": [NaN], "Sensor3": [12.34]}

那么SELECT Time, JSON_EXTRACT(Data, '$.Sensor1')就是完美的

2012-11-01 03:45:23 UTC,  [45.56]
2012-11-01 05:45:23 UTC,  [11.43]

SELECT Time, JSON_EXTRACT(Data, '$.Sensor3')给出

2012-11-01 03:45:23 UTC,  [34.45]
2012-11-01 05:45:23 UTC,  null

这是预期的行为吗?从传感器2中省略NaN会更好吗?

这是预期的行为。根据https://www.json.org/json-en.html,有效的JSON值只能是字符串、数字、true或false或null。因此,BigQuery将NaN解释为null,因为它被视为无效值。

值可以是双引号中的字符串、数字、true或false或null,或者对象或数组。这些结构可以是嵌套。

如果您想保留值NaN,您可以用双引号("NaN"(将其括起来,但它将被视为字符串。或者,如果您不使用/不需要NaN,您可以省略问题中提到的NaN

因此,对于我的应用程序,我总是有{quot;nameA":[array…],"nameB":[aarray…],…}其中array是浮点数的常用范围,即包括一些NaN。如上所述,JSON_EXTRACT实际上并不起作用。但是这个javascript UDF做得很好。

CREATE TEMP FUNCTION EXTRACT_DATA(mystr STRING, param STRING)
RETURNS Array < FLOAT64 > LANGUAGE js AS
"""
const i0 = mystr.indexOf(param);
if (i0 == 0) {
return null;
}
const i1 = mystr.substring(i0).indexOf("[");
if (i1 == 0) {
return null;
}
const i2 = mystr.substring(i0+i1).indexOf("]");
if (i2 == 0) {
return null;
}
const myArray = mystr.substr(i0+i1+1,i2-1).split(',')
return myArray.map(Number);
}
""" ; 

我不知道与没有NaN的数组上的JSON_EXTRACT相比,这会有多贵($'s和cpu_time(。

最新更新