BigQuery UDF Array<TIMESTAMP> 返回。无法强制输出值输入 TIMESTAMP
Posted
技术标签:
【中文标题】BigQuery UDF Array<TIMESTAMP> 返回。无法强制输出值输入 TIMESTAMP【英文标题】:BigQuery UDF Array<TIMESTAMP> return. Failed to coerce output value to type TIMESTAMP 【发布时间】:2019-06-05 14:59:49 【问题描述】:我正在使用 BigQuery javascript UDF 返回日期数组。数组必须是时间戳数组,类似于 GENERATE_TIMESTAMP_ARRAY() 函数,以便匹配 UNNEST CASE WHEN。
当我从我的 JavaScript UDF 返回时间戳数组时会出现问题。如果我指定 RETURNS ARRAY
我尝试了多种字符串格式,例如 'YYYY-MM-DD HH:mm:ss'、'YYYY-MM-DD 00:00:00+00'、'YYYY-MM-DD HH:mm:ss .SSSSSS UTC'。
CREATE TEMP FUNCTION
getCalendarDateArray(date_start STRING,
date_end STRING,
frequency STRING,
unit STRING,
value INT64,
parent STRING,
next_date TIMESTAMP)
RETURNS ARRAY<TIMESTAMP>
LANGUAGE js AS
"""
let dates_array = getTimestampArray(date_start, date_end, frequency, unit, value, parent, next_date);
return dates_array;
"""
OPTIONS
( library=["gs://my-bucket/myfunction.js"] );
UDF 输出当前是格式化的日期字符串数组,不能强制转换为时间戳。为了让 BigQuery 成功强制时间戳,正确的字符串格式是什么?
[
"2019-07-02",
"2019-07-09",
"2019-07-16",
"2019-07-23",
"2019-07-30"
]
【问题讨论】:
使用昂贵的 JS UDF 而不是使用内置的GENERATE_..._ARRAY()
系列函数的原因是什么?
我根据日历日期生成重复日期,而不仅仅是设置间隔。例如:从 X 日期开始每周的第二天,或每月的第三周。但是,在尝试了 UDF 之后,很明显它既昂贵又耗时。相反,我将在上传到 bigquery 之前简单地计算每一行的日期。
【参考方案1】:
使用Date()
:
CREATE TEMP FUNCTION
getCalendarDateArray()
RETURNS ARRAY<TIMESTAMP>
LANGUAGE js AS
"""
return [Date('2018-03-03 10:10:10')]
""";
SELECT getCalendarDateArray() dates
【讨论】:
我不敢相信我没有尝试过这个。使用 moment.js 并认为需要返回字符串。谢谢费利佩。希望你过得好,我们很久以前认识的。 我花了一段时间才弄明白。我将TIMESTAMP
传递给UDF,然后使用对象自省来确定它的类型。感谢您提出问题!至少我们现在记录了这个错误的解决方案:)。如果答案正确,请采纳!【参考方案2】:
只是为了扩展 Felipe Hoffa 接受的答案,以下示例可能显示了会发生什么:
CREATE TEMP FUNCTION getDate_fail() RETURNS TIMESTAMP
LANGUAGE js AS """ return Date.now()""";
CREATE TEMP FUNCTION getDate_succeed() RETURNS TIMESTAMP
LANGUAGE js AS """ return Date(Date.now())""";
前一个函数抛出一个强制异常,而后者成功。
【讨论】:
以上是关于BigQuery UDF Array<TIMESTAMP> 返回。无法强制输出值输入 TIMESTAMP的主要内容,如果未能解决你的问题,请参考以下文章
BigQuery -- 在公开共享项目中使用 UDF 的问题