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,则数组返回正常,但是当我使用 RETURNS ARRAY BigQuery 似乎无法强制日期的字符串格式。

我尝试了多种字符串格式,例如 '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 实现

在 BigQuery 的查询中使用 UDF 作为列

UDF 上的 Bigquery 配额限制

BigQuery -- 在公开共享项目中使用 UDF 的问题

BigQuery 的 UDF 不支持 API 同步查询或者如何使用?

在 BigQuery 中创建 UDF