如何使用点燃数据grid / 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 }
然后"数组表示所有数组的总和"将会: double [] {6.0,9.0,12.0,15.0,18.0}
我已经查看了 @QuerySqlFunction ,但无法找到任何可以帮助我的示例。
这不是sql。任何从缓存中获取数组总和的方法都会很棒。
感谢,
约翰
MyFact
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;
}
}
MyDimension
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
答案 0 :(得分:0)
我看到两种可能的解决方案:
valuesSum
字段添加到MyFact
课程,并在每次更新values
时进行计算。然后,您可以直接查询此新字段,而不是每次动态计算数组总和。使用自定义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 ...