使用 javascript UDF 对 BigQuery 中整数数组的值求和
Summing the values of an integer array in BigQuery using javascript UDF
我有一个看起来像这样的 table,其中 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`
我不明白我在发布的第一段代码中做错了什么导致数组中的值被视为字符串并且 returns 我是这些字符串的串联?
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
.
我有一个看起来像这样的 table,其中 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`
我不明白我在发布的第一段代码中做错了什么导致数组中的值被视为字符串并且 returns 我是这些字符串的串联?
Because JavaScript does not support a 64-bit integer type,
INT64
is unsupported as an input type for JavaScript UDFs. Instead, useFLOAT64
to represent integer values as a number, orSTRING
to represent integer values as a string.
即使该类型不受官方支持,BigQuery 使用 JavaScript 的 String 类型的编码来表示 INT64
,以便在您只想传递值时不丢失精度那种。但是,如果你想转换为数字,你应该使用 parseInt
.