在 BigQuery Java UDF 中对数组进行累积求和时出现问题
Posted
技术标签:
【中文标题】在 BigQuery Java UDF 中对数组进行累积求和时出现问题【英文标题】:An issue when doing cumulative sum of an array in BigQuery Java UDF 【发布时间】:2017-05-24 07:30:01 【问题描述】:我需要在 BigQuery Java UDF 中对一个数组进行累积求和。对于我在下面给出的示例,我期望结果为:[1,3,6,54,54]。但相反,我得到:
谁能告诉我我做错了什么?我是 Java 和 UDF 新手。谢谢!
#Standard SQL
CREATE TEMP FUNCTION
test(a ARRAY<int64>)
RETURNS ARRAY<int64>
LANGUAGE js AS """
n=a.length;
for (var i=1;i<= n-1;i++)
a[i]+=a[i-1];
return a;
""";
WITH
test AS (
SELECT
[
1,
2,
3,
48,
0] AS a)
SELECT
test(a)
FROM
test
【问题讨论】:
【参考方案1】:INT64 is not officially supported with javascript UDFs此时因为没有 64 位整数类型。相反,您应该将 FLOAT64 用于数值,例如:
#StandardSQL
CREATE TEMP FUNCTION
test(a ARRAY<float64>)
RETURNS ARRAY<float64>
LANGUAGE js AS """
n=a.length;
for (var i=1;i<= n-1;i++)
a[i]+=a[i-1];
return a;
""";
WITH
test AS (
SELECT
ARRAY<FLOAT64>[
1,
2,
3,
48,
0] AS a)
SELECT
test(a)
FROM
test
【讨论】:
谢谢!但奇怪的是,它可以计算为 a[i]-=a[i-1] 或 a[i]*=a[i-1] 或 a[i]/=a[i-1] 但只是不是总和...这真的很奇怪..无论如何,非常感谢! :) 这是因为 int64 被表示为 JavaScript 字符串以保持精度(尽管由于 int64 不受官方支持,这可能会发生变化)。坚持使用 FLOAT64 可能是目前最好的选择。以上是关于在 BigQuery Java UDF 中对数组进行累积求和时出现问题的主要内容,如果未能解决你的问题,请参考以下文章
用于合并值列表/数组的 BigQuery JavaScript UDF
BigQuery JavaScript UDF 使用 SQL 查询中的值调用数组