BigQuery 是否支持 Json 内的 NaN?

Does BigQuery support NaN inside Json?

考虑 BigQuery 架构“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 会更好吗?

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

A value can be a string in double quotes, or a number, or true or false or null, or an object or an array. These structures can be nested.

如果您想保留值 NaN 您可以用 双引号 ("NaN") 将其括起来,但它将被视为细绳。或者你可以省略你在问题中提到的 NaN 如果你不会 using/needing 它。

所以对于我的应用程序,我总是有 { "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 相比,这有多贵($'s 和 cpu_time)。