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