Суммирование значений целочисленного массива в BigQuery с использованием javascript UDF

У меня есть таблица, которая выглядит так, где coord1 - повторяющееся целочисленное поле:

введите здесь описание изображения

Теперь я пытаюсь вычислить сумму этого целочисленного массива coord1 в BigQuery, используя следующий код. Как ни странно, после запуска этого кода я получаю конкатенацию строк значений в этом массиве. Вот мой код и результат:

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`

введите здесь описание изображения

Я не понимаю, что я делал неправильно в первом опубликованном мной коде, который приводит к тому, что значения в массиве обрабатываются как строка и возвращают мне конкатенацию этих строк?


person Syed Arefinul Haque    schedule 14.02.2019    source источник


Ответы (1)


Из документация:

Поскольку JavaScript не поддерживает 64-разрядный целочисленный тип, INT64 не поддерживается в качестве типа ввода для пользовательских функций JavaScript. Вместо этого используйте FLOAT64 для представления целочисленных значений в виде числа или STRING для представления целочисленных значений в виде строки.

Хотя этот тип официально не поддерживается, BigQuery использует кодировку типа String в JavaScript для представления INT64, чтобы не потерять точность, если вы просто хотите передать значения этого типа. Однако, если вы хотите преобразовать в Number, вам следует использовать parseInt.

person Elliott Brossard    schedule 14.02.2019