【问题标题】:How to sum an array of doubles with ignite data grid / sql?如何使用 ignite 数据网格/sql 对双精度数组求和?
【发布时间】:2015-10-15 12:12:19
【问题描述】:

如何使用 ignite 数据网格/sql 对双精度数组求和?

给定:1 个维度表 MyDimension 和 1 个事实表 MyFact。加入他们,按几个维度分组 ** 并总结与之相关的事实。现在考虑求和的事实表,它不包含单个双精度值,而是一个双精度数组。而要检索的总和是一个表示所有数组总和的数组。

作为一个例子的话:假设“所有的数组都是”:

array 1: double[] { 1.0, 2.0, 3.0, 4.0, 5.0 }
array 2: double[] { 2.0, 3.0, 4.0, 5.0, 6.0 }
array 3: double[] { 3.0, 4.0, 5.0, 6.0, 7.0 }

那么“表示所有数组之和的数组”将是: 双[] { 6.0, 9.0, 12.0, 15.0, 18.0 }

我查看了 @QuerySqlFunction,但找不到任何可以帮助我的示例。

这不一定是 sql。任何从我的缓存中获取数组总和的方法都很棒。

谢谢,

约翰

我的事实

package com.hsbc.rsl.babarpoc.ignite.starschema;

import org.apache.ignite.cache.query.annotations.QuerySqlField;

public class MyFact {
/** Primary key. */
@QuerySqlField(index = true)
private long uid;

@QuerySqlField(index = true)
private long dimensionUid;

@QuerySqlField
private double values[];

public MyFact(long uid, long dimensionUid, double values[]) {
    this.uid = uid;
    this.dimensionUid = dimensionUid;
    this.values = values;
}

public long getUid() {
    return uid;
}

public void setUid(long uid) {
    this.uid = uid;
}

public long getDimensionUid() {
    return dimensionUid;
}

public void setDimensionUid(long dimensionUid) {
    this.dimensionUid = dimensionUid;
}

public double[] getValues() {
    return values;
}

public void setValues(double[] values) {
    this.values = values;
}
}

我的维度

import org.apache.ignite.cache.query.annotations.QuerySqlField;

public class MyDimension {
@QuerySqlField(index = true)
private long uid;

@QuerySqlField
private String groupBy1;

@QuerySqlField
private String groupBy2;

public MyDimension(String groupBy1, String groupBy2) {
    this.groupBy1 = groupBy1;
    this.groupBy2 = groupBy2;
}

public long getUid() {
    return uid;
}

public void setUid(long uid) {
    this.uid = uid;
}

public String getGroupBy1() {
    return groupBy1;
}

public void setGroupBy1(String groupBy1) {
    this.groupBy1 = groupBy1;
}

public String getGroupBy2() {
    return groupBy2;
}

public void setGroupBy2(String groupBy2) {
    this.groupBy2 = groupBy2;
}

}

查询(不起作用的那个)

我在下面添加了一个示例sql,它将给出1个值的总和,即它不适用于数组:它会产生错误。

SELECT 
      MyDimension.groupBy1, 
      MyDimension.groupBy2, 
      SUM(MyFact.values)
FROM 
     "dimensionCacheName".DimDimension,  
     "factCacheName".FactResult 
WHERE 
      MyDimension.uid=MyFact.dimensionUid 
GROUP BY  
      MyDimension.groupBy1,
      MyDimension.groupBy2

【问题讨论】:

    标签: gridgain ignite


    【解决方案1】:

    我看到了两种可能的解决方案:

    1. valuesSum 字段添加到MyFact 类并在每次更新values 时计算它。然后,您可以直接查询这个新字段,而不是每次都即时计算数组总和。
    2. 使用自定义 SQL 函数。该函数应作为公共类中的静态方法实现,并使用@QuerySqlFunction 注释进行注释。例如:

      public class SqlFunctions {
          @QuerySqlFunction
          public static double arraySum(double[] values) {
              double sum = 0.0;
      
              for (double value : values)
                  sum += value;
      
              return sum;
          }
      }
      

      这个类必须在缓存配置中提供:

      cacheCfg.setSqlFunctionClasses(SqlFunctions.class);
      

      然后您可以像这样运行查询:

      SELECT SUM(arraySum(values)) FROM ...
      

    【讨论】:

    • 感谢瓦伦丁。我添加了一个示例来解释这意味着什么:“要检索的总和是一个表示所有数组总和的数组。”。我不需要 1 个值是 1 个数组的值的总和......这很简单。
    • 对不起,我错过了。但这实际上并没有改变任何东西 - 两种解决方案仍然有效,但您根本不需要使用 SQL sum() 函数。因此,如果您使用自定义函数,查询应如下所示:SELECT arraySum(values) FROM ...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多