1

我有一个大查询代码。

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")

它返回:

2022-02-16 01:59:59 UTC

所以 BigQuery 确实可以正确解析它。我不确定为什么 UDF 不会发生这种情况。在搜索互联网时,我发现了这个问题,正如答案所示,如果我将 return 语句更改为:

return Date(res.created_time);

它解决了这个问题。但是对于我的一个项目,由于结构列的数量很大,对每个时间戳都执行此操作是不可行的。

所以,我想知道是否有人有更好的选择?

PS:我已经从上面的例子中删除了很多非必要的部分,所以这可能看起来有点抽象。此外,实际用例有点不同和复杂,这就是我需要那个 JS udf 的原因。

4

1 回答 1

1

做你想做的最好的方法是实现以下代码。

return Date(res.created_time);

当您将 a 传递TIMESTAMP给 a时会发生这种情况UDF,它被表示为一个DATE对象,如文档中所述。这就像TIMESTAMPJavaScript UDF返回 a ,您需要在其中构造并返回一个DATE对象。

于 2022-02-16T18:27:51.233 回答