Суммирование значений целочисленного массива в BigQuery с использованием JavaScript UDF - PullRequest
0 голосов
/ 14 февраля 2019

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

enter image description here

Теперь я пытаюсь вычислить суммуэтого целочисленного массива 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`

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

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

1 Ответ

0 голосов
/ 14 февраля 2019

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

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

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

...