Суммирование значений целочисленного массива в 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`

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

1 ответ

Решение

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

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

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

Другие вопросы по тегам