BigQuery:从 JS udf 抛出返回时间戳 "Failed to coerce output value to type TIMESTAMP"
BigQuery : Returning timestamp from JS udf throwing "Failed to coerce output value to type TIMESTAMP"
我有一个 bigquery 代码。
CREATE TEMP FUNCTION to_struct_attributes(input STRING)
RETURNS STRUCT<status_code STRING, created_time TIMESTAMP>
LANGUAGE js AS """
let res = JSON.parse(input);
res['created_time'] = Date(res['created_time'])
return res;
""";
SELECT
5 AS ID,
to_struct_attributes(
TO_JSON_STRING(
STRUCT(
TIMESTAMP(PARSE_TIMESTAMP('%Y%m%d%H%M%S', '20220215175959','America/Los_Angeles')) AS created_time
)
)
) AS ATTRIBUTES;
执行此操作时,出现以下错误:
Failed to coerce output value "2022-02-16 01:59:59+00" to type TIMESTAMP
我觉得这很奇怪,因为 BigQuery 应该能够正确解释它,而且我没有遇到任何其他数据类型的问题。另外,如果我这样做:
SELECT TIMESTAMP("2022-02-16 01:59:59+00")
它returns:
2022-02-16 01:59:59 UTC
所以 BigQuery 确实可以正确解析它。我不确定为什么 UDF 不会发生这种情况。在互联网上搜索时,我发现 并且如答案所示,如果我将 return 语句更改为:
return Date(res.created_time);
它解决了这个问题。但是对于我的一个项目,由于结构列的数量很多,所以对每个时间戳都这样做是不可行的。
所以,我想知道是否有人有更好的替代品?
PS : 我从上面的例子中删除了很多不重要的部分,所以这看起来有点抽象。此外,实际用例有点不同且复杂,这就是为什么我需要那个 JS udf。
做你想做的最好的方法是实现下面的代码。
return Date(res.created_time);
当您将 TIMESTAMP
传递给 UDF
时会发生这种情况,它表示为 DATE
对象,如 documentation. This is like a return of a TIMESTAMP
from a JavaScript UDF 中所述,您需要构造并 return 一个 DATE
对象。
我有一个 bigquery 代码。
CREATE TEMP FUNCTION to_struct_attributes(input STRING)
RETURNS STRUCT<status_code STRING, created_time TIMESTAMP>
LANGUAGE js AS """
let res = JSON.parse(input);
res['created_time'] = Date(res['created_time'])
return res;
""";
SELECT
5 AS ID,
to_struct_attributes(
TO_JSON_STRING(
STRUCT(
TIMESTAMP(PARSE_TIMESTAMP('%Y%m%d%H%M%S', '20220215175959','America/Los_Angeles')) AS created_time
)
)
) AS ATTRIBUTES;
执行此操作时,出现以下错误:
Failed to coerce output value "2022-02-16 01:59:59+00" to type TIMESTAMP
我觉得这很奇怪,因为 BigQuery 应该能够正确解释它,而且我没有遇到任何其他数据类型的问题。另外,如果我这样做:
SELECT TIMESTAMP("2022-02-16 01:59:59+00")
它returns:
2022-02-16 01:59:59 UTC
所以 BigQuery 确实可以正确解析它。我不确定为什么 UDF 不会发生这种情况。在互联网上搜索时,我发现
return Date(res.created_time);
它解决了这个问题。但是对于我的一个项目,由于结构列的数量很多,所以对每个时间戳都这样做是不可行的。
所以,我想知道是否有人有更好的替代品?
PS : 我从上面的例子中删除了很多不重要的部分,所以这看起来有点抽象。此外,实际用例有点不同且复杂,这就是为什么我需要那个 JS udf。
做你想做的最好的方法是实现下面的代码。
return Date(res.created_time);
当您将 TIMESTAMP
传递给 UDF
时会发生这种情况,它表示为 DATE
对象,如 documentation. This is like a return of a TIMESTAMP
from a JavaScript UDF 中所述,您需要构造并 return 一个 DATE
对象。