2015-10-13 25 views
0

如何用點燃數據grid/sql來求和雙精度數組?如何用點燃數據網格/ sql來總結一個雙精度數組?

鑑於:1維度表我的維度和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 } 

那麼 「代表所有陣列的總和陣列」 將是: 雙[] {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

我看到了兩個可能的解決方案:

  1. 添加valuesSumMyFact階級和各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 ... 
    
+0

謝謝瓦倫丁。我已經添加了一個示例來解釋這意味着什麼:「要檢索的總和,是表示所有數組總和的數組。」我不需要1個值是1個數組值的總和......這是微不足道的。 –

+0

對不起,我錯過了。但是這實際上並沒有改變任何東西 - 兩種解決方案都可以工作,但你根本不需要使用SQL'sum()'函數。所以,如果你使用自定義函數,查詢應該看起來像這樣:'SELECT arraySum(values)FROM ...' –

相關問題