BigQuery JavaScript UDF:V8 实例的区域

Posted

技术标签:

【中文标题】BigQuery JavaScript UDF:V8 实例的区域【英文标题】:BigQuery JavaScript UDFs: Region of V8 instances 【发布时间】:2018-10-10 08:01:30 【问题描述】:

在 BigQuery 中,您可以添加将在 V8 实例上执行的 javascript UDF。 This page on googleblog.com(几乎是我能找到的关于该主题的唯一一页)声明

JavaScript UDF 在 Google 服务器上运行的 Google V8 实例上执行。您的代码在您的数据附近运行,以最大限度地减少额外的延迟。

因此,例如,当我在欧洲有数据时,我希望 UDF 将在同一区域执行。但是,当我运行以下查询时,该实例似乎不像我预期的那样接近我的数据:

CREATE TEMP FUNCTION getDate()
RETURNS String
LANGUAGE js AS """
return new Date();
""";
SELECT CURRENT_DATETIME() dateTimeBigQuery
     , getDate() as dateTimeJavaScript

此语句的输出:

dateTimeBigQuery                    dateTimeJavaScript
2018-10-10T07:42:32.556699          Wed Oct 10 2018 00:42:32 GMT-0700 (PDT)

This page on Time functions in BigQuery 告诉我 CURRENT_DATETIME() 函数在没有指定时区时返回 UTC 日期时间。

This page on Date functions in JavaScript 状态

如果没有提供参数,则构造函数会根据系统设置为当前日期和时间创建一个 JavaScript Date 对象,用于时区偏移。

当我使用 BigQuery 表中的数据(没有时区的日期时间)并将其传递给 JavaScript 函数时,它还将返回 GMT-0700 的日期时间

所以我可以安全地假设 V8 的实例没有靠近我的数据运行吗? 如果是这样的话,有没有办法为那个实例指定一个区域?

【问题讨论】:

【参考方案1】:

BigQuery 会覆盖 Date 的构造函数以使用 UTC,而不是从执行 UDF 的任何位置获取时区,以便与 CURRENT_DATECURRENT_DATETIME 等函数保持一致。实际的 V8 环境始终与执行查询中其他逻辑的作业一起运行。

【讨论】:

所以如果我理解正确的话; JavaScript 函数的输出不是它在此处运行的实例的实际时区? 没错,不管代码在哪里执行都会被覆盖使用UTC。

以上是关于BigQuery JavaScript UDF:V8 实例的区域的主要内容,如果未能解决你的问题,请参考以下文章

BigQuery JavaScript UDF:V8 实例的区域

用于合并值列表/数组的 BigQuery JavaScript UDF

描述如何在 SQL 中内联定义 Javascript UDF 函数的 BigQuery 文档在哪里(不是在 UDF 编辑器或单独的文件中)?

使用 JavaScript BigQuery UDF 解密/解码 AES256 [重复]

用于 BigQuery UDF 的纯 javascript HTML 解析器

在 google bigquery 中,如何使用 google python 客户端使用 javascript UDF