【问题标题】:Summing the values of an integer array in BigQuery using javascript UDF使用 javascript UDF 在 BigQuery 中对整数数组的值求和
【发布时间】:2019-07-08 22:56:04
【问题描述】:

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

现在,我尝试使用以下代码在 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`

但是,当我在添加数组中的值之前添加 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`

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

【问题讨论】:

    标签: javascript google-bigquery user-defined-functions bigquery-standard-sql


    【解决方案1】:

    来自the documentation

    由于 JavaScript 不支持 64 位整数类型,因此不支持将 INT64 作为 JavaScript UDF 的输入类型。相反,使用FLOAT64 将整数值表示为数字,或使用STRING 将整数值表示为字符串。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-13
      • 1970-01-01
      • 2020-11-15
      相关资源
      最近更新 更多