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)。
考虑 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)。