Как суммировать массив парных разрядов с сеткой зажигания данных / sql?
Как суммировать массив парных разрядов с сеткой зажигания данных / sql?
Дано: 1 таблица измерений MyDimension и 1 таблица фактов MyFact. Присоединитесь к ним, сгруппируйте по нескольким измерениям ** и суммируйте факт, связанный с этим. Теперь рассмотрим таблицу фактов как сумму, которая не содержит единственного двойного значения, а представляет собой массив значений типа double. И сумма, которую нужно извлечь, представляет собой массив, представляющий сумму всех массивов.
В качестве примера слова: Предположим, что "все массивы":
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. Любой способ получить сумму массивов из моего кеша был бы великолепен.
Спасибо,
Johan
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
1 ответ
Я вижу два возможных решения:
- добавлять
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 ...