【问题标题】:An issue when doing cumulative sum of an array in BigQuery Java UDF在 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

【问题讨论】:

    标签: java google-bigquery udf


    【解决方案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 可能是目前最好的选择。
    猜你喜欢
    • 2019-07-08
    • 1970-01-01
    • 1970-01-01
    • 2011-04-06
    • 2023-01-20
    • 1970-01-01
    • 1970-01-01
    • 2013-05-08
    • 2011-04-15
    相关资源
    最近更新 更多