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 对象。