0

考虑 BigQuery Schema "Time=Timestamp, Data=String" 和以下两行

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 会更好吗?

4

2 回答 2

2

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

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

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

于 2022-01-11T03:10:47.013 回答
0

所以对于我的应用程序,我总是有 { "nameA": [array...], "nameB": [array...], ...} 其中 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 相比会有多贵($ 和 cpu_time)。

于 2022-01-15T17:50:27.600 回答