0

ignite data grid / sqlでdoubleの配列を合計する方法は?

与えられた: 1 つのディメンション テーブルMyDimensionと 1 つのファクト テーブルMyFact。それらを結合し、いくつかの次元 ** でグループ化し、それに関連する事実を合計します。次に、単一の double 値ではなく、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 である必要はありません。キャッシュから配列の合計を取得する方法はどれでも素晴らしいでしょう。

ありがとう、

ヨハン

マイファクト

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
4

1 に答える 1

0

考えられる解決策は 2 つあります。

  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 ...
    
于 2015-10-13T21:08:25.193 に答える