javascript - 使用 javascript UDF 对 BigQuery 中整数数组的值求和

标签 javascript user-defined-functions google-bigquery

我有一个看起来像这样的表,其中 coord1 是一个重复的整数字段:

enter image description here

现在,我尝试使用以下代码在 BigQuery 中计算整数数组 coord1 的总和。运行此代码后,令人惊讶的是,我得到了该数组中值的字符串连接。这是我的代码和输出:

CREATE TEMP FUNCTION func(array_values ARRAY<INT64>)
RETURNS INT64
LANGUAGE js AS """
  var divisor = 0;
  for(var i = 0; i < array_values.length; i++){
    divisor = divisor + array_values[i];
  };
  return divisor;
""";

with
  `project.dataset.table` as
  (
    SELECT 1 id1, [1, 2, 3, 4] coord1 UNION ALL
    SELECT 2, [2, 0, 1, 1, 0, 2, 1, 1]
  )
SELECT
  id1,
  coord1,
  func(coord1) as array_sum
from
 `project.dataset.table`

enter image description here

但是当我在向数组中添加值之前添加一个 parseInt 函数时,它似乎正确地添加了该数组中的数字:

CREATE TEMP FUNCTION func(array_values ARRAY<INT64>)
RETURNS INT64
LANGUAGE js AS """
  var divisor = 0;
  for(var i = 0; i < array_values.length; i++){
    divisor = divisor + parseInt(array_values[i]);
  };
  return divisor;
""";

with
  `project.dataset.table` as
  (
    SELECT 1 id1, [1, 2, 3, 4] coord1 UNION ALL
    SELECT 2, [2, 0, 1, 1, 0, 2, 1, 1]
  )
SELECT
  id1,
  coord1,
  func(coord1) as array_sum
from
 `project.dataset.table`

enter image description here

我不明白我在发布的第一段代码中做错了什么导致数组中的值被视为字符串并返回这些字符串的串联?

最佳答案

来自 the documentation :

Because JavaScript does not support a 64-bit integer type, INT64 is unsupported as an input type for JavaScript UDFs. Instead, use FLOAT64 to represent integer values as a number, or STRING to represent integer values as a string.

即使该类型不受官方支持,BigQuery 使用 JavaScript 的 String 类型的编码来表示 INT64,以便在您只想传递该类型的值时不丢失精度。但是,如果你想转换为数字,你应该使用 parseInt

关于javascript - 使用 javascript UDF 对 BigQuery 中整数数组的值求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54698462/

相关文章:

MySQL 从使用 UDF 的子查询中截断字符串

arrays - pandas_udf 对两个 ArrayType(StringType()) 字段进行操作

python-3.x - 将 avro 文件压缩为 gzip (.gz) 压缩

javascript - 2个不相关的div具有相同的高度

javascript - Google Places Javascript API 获取响应状态

javascript - Node js 什么时候应该使用异步机制

javascript - 如何使用用户定义的过滤器或其他方法控制通过 CSS 模块或样式化组件自动生成的动态类名

javascript - 如何在浏览器中更改 JavaScript,然后在修改后运行它?

google-bigquery - 控制和监视 BI Engine Reservations 的使用

google-bigquery - Big Query 中的 CAST 和 REPLACE