我有一个大查询代码。
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 的原因。