Как суммировать массив парных разрядов с сеткой зажигания данных / 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 ответ

Я вижу два возможных решения:

  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 ...
    
Другие вопросы по тегам